Как рассчитать частоту встречаемости в большом запросе для истории покупок - PullRequest
0 голосов
/ 19 декабря 2018

У меня следующая структура таблицы:

email | date  | YEAR

antrim@8qwh37kibb6ut7.ml  | 2018-10-25   | 2018    
asam@bpvi.ml              | 2018-02-15   | 2018   
client5@test.com          | 2018-04-14   | 2018      
antrim@8qwh37kibb6ut7.ml  | 2017-07-19   | 2017      
client4@test.com          | 2017-09-30   | 2017         
asam@bpvi.ml              | 2017-01-25   | 2017        
antrim@8qwh37kibb6ut7.ml  | 2017-10-25   | 2017        
asam@bpvi.ml              | 2016-10-25   | 2016        
antrim@8qwh37kibb6ut7.ml  | 2016-05-17   | 2016        

Сначала мне нужны клиенты, которые купили только за три года, те, которые повторялись.Так что для этого я сам присоединился три раза, хотя я подозреваю, что это не самый эффективный

SELECT COUNT(DISTINCT first_year.email) as repetidos
 FROM `table` AS first_year
 JOIN `table` AS second_year
  ON first_year.email = second_year.email
 JOIN `table` AS third_year
  ON first_year.email = third_year.email
 AND first_year.year = 2016
 WHERE second_year.year = 2017
 AND third_year.year = 2018

И это дает мне электронные письма людей, которые купили за три года.Примерно так:

email

antrim@8qwh37kibb6ut7.ml  
asam@bpvi.ml              

Мне нужно знать частоту в днях, то есть, если вы купили 5 раз в магазине, мне нужно знать частоту ваших покупок, если вы покупаете каждые 40 дней, каждые 20дней и так, я нашел это

SELECT DATE_DIFF(DATE '2018-02-20', DATE '2018-01-15', DAY) as days_diff;

Но что я не знаю, как сделать, это использовать эту формулу с моим предыдущим запросом.Это возможно?Большое спасибо!

1 Ответ

0 голосов
/ 19 декабря 2018

Думаю, вы захотите:

SELECT t.email,
       DATE_DIFF(MAX(date), MIN(date), day) / NULLIF(COUNT(*) - 1, 0) as avg_date_diff
FROM `table` t
WHERE t.year IN (2016, 2017, 2018)
GROUP BY t.email
HAVING COUNT(DISTINCT t.year) = 3
...