所有客户的第一笔交易和最后一笔交易之间的平均时间是多少(平均生命周期 - 累积)

what is the average time between the fist and the last transaction for all customers (average life time - CUMULATIVE)

我能够计算出每个客户的第一笔交易和最后一笔交易之间的时间(参见下面的代码)。

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

我如何扩展它来回答这个问题:我的客户第一次交易和最后一次交易之间的平均时间是多少?

只需添加一级聚合:

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 表达式周围的括号是多余的

您可以使用二级聚合:

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().

简化了子查询