Длина интервала AVG для таблицы с покупками - PullRequest
0 голосов
/ 20 сентября 2018

Я был бы признателен за помощь с таблицей, которая выглядит следующим образом:

  client_id | transaction_date | amount
  -------------------------------------
      123   |     2017-01-16   |   12
      234   |     2017-01-11   |   25 
      345   |     2017-01-12   |  211

Я хочу получить среднее значение за период времени, в течение которого тот же клиент делал следующую транзакцию - другими словами - что былосреднее число дней, которое привело к следующей транзакции для определенного пользователя?

Я думал о некотором TIMESTAMPDIFF, но не представлял, как реализовать это в этом случае.

Ответы [ 2 ]

0 голосов
/ 20 сентября 2018

Самый простой способ - взять разницу между максимумом и минимумом и разделить на единицу меньше числа строк.

Итак:

select client_id,
       ( datediff(max(transaction_date), min(transaction_date)) /
         nullif(count(*) - 1, 0)
       ) as avg_duration
from t
group by client_id;

Поскольку вы имеете дело с датами,Вы можете использовать datediff() вместо timestampdiff() (экономит вас на аргументе функции).

0 голосов
/ 20 сентября 2018

Сделайте что-то вроде этого

SELECT client_id,avg(DATEDIFF(transaction_date,next_transaction_date)) FROM
(
    SELECT 
    client_id,
    transaction_date ,
    LEAD(transaction_date,1) OVER (
        PARTITION BY client_id
        ORDER BY transaction_date) next_transaction_date
    FROM 
    table    
) as s WHERE next_transaction_date is not null

Вот ссылка для понимания функции LEAD

http://www.mysqltutorial.org/mysql-window-functions/mysql-lead-function/

...