каково среднее время между первой и последней транзакцией для всех клиентов (среднее время жизни - Накопительное) - PullRequest
0 голосов
/ 09 января 2020

Мне удалось вычислить время между первой и последней транзакцией для каждого клиента (см. Код ниже).

SELECT customer_id, max(order_time) - min(order_time) as days_from_first_to_last_order,
 (case when count(*) > 1
             then datediff(day, min(order_time), max(order_time)) / (count(*) - 1)
        end) as avg_time
FROM ORDERS
group by customer_id

Как я могу расширить это, чтобы ответить на вопрос: каково среднее время между Первая и последняя транзакция для моих клиентов?

Ответы [ 2 ]

1 голос
/ 09 января 2020

Вы можете использовать второй уровень агрегирования:

SELECT AVG(avg_time * 1.0)
FROM (SELECT customer_id, max(order_time) - min(order_time) as days_from_first_to_last_order, (case when count() > 1 then 
             datediff(day, min(order_time), max(order_time)) / nullif(count() - 1, 0)  as avg_time
      FROM ORDERS
      GROUP BY customer_id
     ) c

Вы заметите, что я упростил подзапрос с помощью nullif().

1 голос
/ 09 января 2020

Просто добавьте один уровень агрегирования:

SELECT AVG(avg_time) avg_time
FROM (
    SELECT 
        CASE 
            WHEN COUNT(*) > 1 
            THEN datediff(day, min(order_time), max(order_time)) / (count() - 1) 
        END as avg_time 
    FROM orders
    GROUP BY customer_id
) t

Примечание:

  • вам нужен только столбец avg_time в подзапросе, чтобы получить ожидаемый результат, поэтому я удалил остальных; это означает, что меньше вычислений агрегации для вашей RDBMS

  • круглые скобки вокруг выражения case излишни

...