Клиентов находят через EXISTS: январская коммуникация и продажа в следующие 30 дней. Во второй задаче значения разделяют относительно среднего; для приведённого списка аномальны 5000, 1300 и 2000.
SQL-продажи после коммуникации и поиск аномальных значений
Клиентов находят через EXISTS: январская коммуникация и продажа в следующие 30 дней. Во второй задаче значения разделяют относительно среднего; для приведённого списка аномальны 5000, 1300 и 2000.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Найди всех клиентов в январе, у которых после коммуникации в течении 30 дней была хотя бы одна продажа.
sales
id customer_id amount sale_date [phone]
communications
id customer_id type comm_date partition_date 1 1 mail [phone] call [phone] call [phone] email [phone] sms [phone]
#Есть список нужно написать функцию, которая вернет два списка, один с нормальными значениями, второй с аномалиями. Пусть для начала аномалия это значение, которое превышает среднее значение
data = [100, 200, 150, 5000, 1300, 120, 700, 2000, 200]
Ответ
Клиентов находят через EXISTS: январская коммуникация и продажа в следующие 30 дней. Во второй задаче значения разделяют относительно среднего; для приведённого списка аномальны 5000, 1300 и 2000.
Это две независимые задачи. Считаем январь месяцем коммуникации; границу 30 дней включаем, момент самой коммуникации исключаем. Параметры задают начало января и февраля нужного года. PostgreSQL:
SELECT DISTINCT c.customer_id
FROM communications c
WHERE c.comm_date >= :january_start
AND c.comm_date < :february_start
AND EXISTS (
SELECT 1 FROM sales s
WHERE s.customer_id = c.customer_id
AND s.sale_date > c.comm_date
AND s.sale_date <= c.comm_date + INTERVAL '30 days'
);
Февральские продажи исключать нельзя. Для числового списка Python:
def split_values(data):
if not data:
return [], []
mean = sum(data) / len(data)
normal = [x for x in data if x <= mean]
anomalies = [x for x in data if x > mean]
return normal, anomalies
Среднее равно 9770/9. Правило «выше среднего» задано условием, но само по себе не является надёжным статистическим детектором аномалий.