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

时间:2013-04-30 13:13:00

标签: sql oracle

我已经搜索了所有但似乎无法找到如何计算每个客户的订单之间的平均时间。我正在使用Oracle SQL Developer。我已经尝试过使用lag()函数而没有任何快乐。

以下示例数据显示了客户在3个不同场合购买的产品。所有购买之间的平均时间为7.5天((6 + 9)/ 2)。

CustID   OrderDate 
-------  ---------
1000000  14-AUG-12
1000000  23-AUG-12
1000000  29-AUG-12

那么我如何计算每个客户的平均值?

任何帮助都会非常感激。

4 个答案:

答案 0 :(得分:5)

如果只需要平均值,那么我认为你可以通过查看最小和最大日期,然后通过订单之间的间隙数量潜水来完成没有窗口函数的简单查询:

SELECT CustID, (MAX(OrderDate) - MIN(OrderDate)) / (COUNT(*) - 1)
  FROM Orders
 GROUP BY CustID
HAVING COUNT(*) > 1

答案 1 :(得分:4)

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

答案 2 :(得分:3)

这里的关键是lag分析函数

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 )

答案 3 :(得分:0)

使用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