4

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

4 回答 4

6

如果只需要平均平均值,那么我认为您可以通过查看最小和最大日期,然后按订单之间的间隔数跳水,从而摆脱没有窗口函数的简单查询:

SELECT CustID, (MAX(OrderDate) - MIN(OrderDate)) / (COUNT(*) - 1)
  FROM Orders
 GROUP BY CustID
HAVING COUNT(*) > 1
于 2013-04-30T14:03:00.253 回答
5

这里的关键是滞后分析函数

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 )
于 2013-04-30T13:16:14.770 回答
5

分析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
于 2013-04-30T13:22:30.527 回答
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
于 2017-12-07T10:36:31.160 回答