所有客户的第一笔交易和最后一笔交易之间的平均时间是多少(平均生命周期 - 累积)
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()
.
简化了子查询
我能够计算出每个客户的第一笔交易和最后一笔交易之间的时间(参见下面的代码)。
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()
.