SQL Как рассчитать среднее время между покупками заказа? (делать вычисления sql на основе следующей и предыдущей строки) - PullRequest
0 голосов
/ 27 июня 2019

У меня есть простая таблица, которая содержит электронную почту клиента, количество его заказов (так, если это их 1-й, 3-й, 5-й и т. Д.), Дату создания этого заказа, стоимость этого заказа и общую сумму заказа.рассчитывать на этого клиента.

Вот как выглядит моя таблица

Email          Order Date     Value Total
r2n1w@gmail.com 1   12/1/2016   85  5
r2n1w@gmail.com 2   2/6/2017    125 5
r2n1w@gmail.com 3   2/17/2017   75  5
r2n1w@gmail.com 4   3/2/2017    65  5
r2n1w@gmail.com 5   3/20/2017   130 5
ation@gmail.com 1   2/12/2018   150 1
ylove@gmail.com 1   6/15/2018   36  3
ylove@gmail.com 2   7/16/2018   41  3
ylove@gmail.com 3   1/21/2019   140 3
keria@gmail.com 1   8/10/2018   54  2
keria@gmail.com 2   11/16/2018  65  2

Я хочу рассчитать среднее время между покупками для каждого покупателя.Итак, давайте возьмем клиента ylove.Первая покупка - 15.06.18.Следующий - 16.07.18, то есть 31 день, а следующая покупка - 21.01.2009, то есть 189 дней.Среднее время покупки между заказами составит 110 дней.

Но я понятия не имею, как заставить SQL посмотреть на следующую строку и рассчитать на основе этого, но затем перезапустить, когда он достигнет нового клиента.

Вот мой запрос на получение этой таблицы:

SELECT 
F.CustomerEmail
,F.OrderCountBase
,F.Date_Created
,F.Total
,F.TotalOrdersBase
FROM #FullBase F 
ORDER BY f.CustomerEmail

Если кто-нибудь может дать мне несколько советов, это будет очень признательно.

И тогда, возможно, я смогу рассчитатьразница в стоимости (в процентах).Так, например, ylove потратила 36 долларов на первый заказ, 41 доллар на второй, что на 13% больше.Тогда их второй заказ составлял 140 долларов, что на 341% больше.Таким образом, в среднем этот клиент увеличил стоимость заказа на 177%.Не имеет отношения к SQL, но это правильный способ расчета метрики, как это?

Ответы [ 2 ]

2 голосов
/ 27 июня 2019

глядя на ваш образец, вы можете попытаться использовать разницу в форме min и max, разделенную на общую сумму

select email, datediff(day,  min(Order_Date), max(Order_Date))/(total-1) as avg_days
from your_table  
group by  email

и для управления также только одним заказом

select email, 
  case when  total-1 > 0 then  
    datediff(day,  min(Order_Date), max(Order_Date))/(total-1) 
  else  datediff(day,  min(Order_Date), max(Order_Date)) end as avg_days
from your_table  
group by  email
1 голос
/ 27 июня 2019

Простейшая формулировка:

select email,
       datediff(day,  min(Order_Date), max(Order_Date)) / nullif(total-1, 0) as avg_days
from t  
group by email;

Вы можете видеть, что это так. Рассмотрим три заказа с od1, od2 и od3 в качестве даты заказа. Среднее значение:

( (od2 - od1) + (od3 - od2) ) / 2

Проверьте арифметику:

--> ( od2 - od1 + od3 - od2 ) / 2
--> ( od3 - od1 ) / 2

Это довольно очевидно обобщает на большее количество заказов.

Отсюда max() минус min().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...