Sql 计算每个客户的平均订单间隔时间

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

我已经到处搜索了,但似乎找不到如何计算每个客户的平均订单间隔时间。我正在使用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 , 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