我能够计算出每个客户第一次交易和最后一次交易之间的时间(请参见下面的代码)。
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
我该如何回答以下问题:我的客户从第一笔交易到最后一笔交易的平均时间是多少?
答案 0 :(得分:1)
只需添加一个聚合级别:
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
表达式周围的括号是多余的
答案 1 :(得分:1)
您可以使用第二级聚合:
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()
简化了子查询。