звонков на 20 млн записей. И мне нужно в неё добавить 1 поле new_customer и пробежаться по всей базе и заполнить это поле исходя из условия:
беру datetime записи, и если этот кастомер звонил за последние 3 месяца то надо прописать 0, если он звонил более чем 3 месяца то 2, а если ни разу не звонил (1 звонок) то 1.
Я попытался сделать что то типа этого:
UPDATE calls a1
SET new_customer = CASE
WHEN EXISTS (
SELECT 1
FROM calls a2
WHERE a2.hashed_phone = a1.hashed_phone
AND a2.call_start < a1.call_datetime AND a2.call_start > (a1.call_datetime - INTERVAL 3 MONTH)
) THEN 0
WHEN EXISTS (
SELECT 1
FROM calls a3
WHERE a3.hashed_phone = a1.hashed_phone
AND a3.call_start < a1.call_datetime
) THEN 2
ELSE 1
END;
Пробовал ставить с ограничением на маленький диапазон и это очень долго выполнялось. По всей базе прям нереально долго бы было.
Может я что то туплю и какой то более очевидный способ не вижу без использования подзапросов?))
>добавлять столбец в бд с 20 млн записей
Надо НЕ В ЭТУ таблицу это поле добавлять. В таблицу заказчиков.
Ну там за несколько лет накопилось)
А вы ещё и логически хотите заполнить новое поле. Тут на полдня спокойно крутиться может
это поле нужно чтобы отслеживать новых и вернувшихся клиентов.
надо БД нормализовывать, слегка легче будет
использование подзапросов тут ничего не меняет
Давай лучше вернёмся к печке... У тебя под этот запрос индексы есть ?
все поля нужные с индексами (дата и хэш клиента)
нужно понять тип индексов
А почему никто не обратил внимание, что значения в этом новом поле могут стать неактуальными на следующий день. Какой вообще смысл именно заполнять поле? Не проще ли просто функцию написать и ее использовать при определении вида клиента в момент звонка оператору?
Нужно значение на момент совершения строки, все норм, я обращал внимание
Там аналитики скорее всего собираются искать корреляции между проводимыми акциями и числом возвратунов за временной период этой акции
Обсуждают сегодня