Sql 计算每个客户的平均订单间隔时间
我已经到处搜索了,但似乎找不到如何计算每个客户的平均订单间隔时间。我正在使用Oracle SQL Developer。我尝试过使用lag()函数,但毫无乐趣 下面的示例数据显示了一位客户在3个不同的场合购买的产品。所有购买之间的平均时间为7.5天((6+9)/2) 那么如何计算每个客户的平均值呢 任何帮助都将不胜感激。这里的关键是分析函数Sql 计算每个客户的平均订单间隔时间,sql,oracle,Sql,Oracle,我已经到处搜索了,但似乎找不到如何计算每个客户的平均订单间隔时间。我正在使用Oracle SQL Developer。我尝试过使用lag()函数,但毫无乐趣 下面的示例数据显示了一位客户在3个不同的场合购买的产品。所有购买之间的平均时间为7.5天((6+9)/2) 那么如何计算每个客户的平均值呢 任何帮助都将不胜感激。这里的关键是分析函数 select cust_id , avg(orderdate - lag_orderdate) as avg_time_between_orders from
select cust_id , avg(orderdate - lag_orderdate) as avg_time_between_orders
from (
select cust_id , orderDate , lag(orderdate) over (partition by cust_id) as lag_orderdate
from orders )
LAG
分析函数肯定是答案,但查询应该更像这样:
SELECT CustID, AVG(OrderDate - PriorDate)
FROM (
SELECT
CustID,
OrderDate,
LAG(OrderDate) OVER (PARTITION BY CustID ORDER BY OrderDate) as PriorDate
FROM Orders)
GROUP BY CustID
如果只需要平均值,那么我认为您可以通过查看最小日期和最大日期,然后根据订单之间的差距数量进行细分,而不使用窗口函数进行简单查询:
SELECT CustID, (MAX(OrderDate) - MIN(OrderDate)) / (COUNT(*) - 1)
FROM Orders
GROUP BY CustID
HAVING COUNT(*) > 1
以Ed的回答为起点,使用CTE获得所有订单的平均值
WITH Sales_CTE (CustomerId, OrderDays, OrderCount)
AS
(
SELECT CustomerId, (datediff(day,Min(OrderTime),Max(OrderTime))) / (COUNT(*) - 1) AS OrderDays, COUNT(*) AS OrderCount
FROM tblStoreOrders GROUP BY CustomerId HAVING COUNT(*) > 1
)
SELECT Avg(OrderDays) FROM Sales_CTE
也许看看这篇文章:[[1]:非常合理的解决方案,我最终使用了cte,因为我希望所有客户的平均值。
WITH Sales_CTE (CustomerId, OrderDays, OrderCount)
AS
(
SELECT CustomerId, (datediff(day,Min(OrderTime),Max(OrderTime))) / (COUNT(*) - 1) AS OrderDays, COUNT(*) AS OrderCount
FROM tblStoreOrders GROUP BY CustomerId HAVING COUNT(*) > 1
)
SELECT Avg(OrderDays) FROM Sales_CTE