【问题标题】:Calculate average between rows in SQL by using lag and ignore first row使用滞后计算 SQL 中行之间的平均值并忽略第一行
【发布时间】:2019-05-25 10:28:45
【问题描述】:

我正在尝试编写一个 SQL 查询来计算购买两次或多次购买的所有客户从购买到购买的平均天数:

  Customer_ID     |   Average number of day
    1033          |            175
     11           |            334
    1100          |            202.5
    111           |            52.5

我成功显示了所有客户的所有购买日期,并计算了购买之间的天数。

SELECT Customer_ID,  Order_Date Cur,
LAG(Order_Date, 1) OVER (ORDER BY Customer_ID) AS Previous,
DATEDIFF(day, LAG(Order_Date, 1) OVER (ORDER BY Customer_ID), Order_Date) 
[Days Between Purchases]
FROM Orders

如何忽略每个客户的第一行并计算购买之间的平均值? (我必须在我的回答中使用 LAG

【问题讨论】:

  • 什么版本的 SQL Server?您的代码暗示您使用 2008 年。
  • 另外,第一行的列之间的天数如何为 0?应该是NULL;这是您的完整查询吗?

标签: sql sql-server


【解决方案1】:

最简单的方法是聚合和一些算术:

SELECT CustomerId,
       DATEDIFF(day, MIN(o.Order_Date), MAX(o.Order_date)) * 1.0 / NULLIF(COUNT(*) - 1, 0)
FROM Orders o
GROUP BY CustomerId
HAVING COUNT(*) >= 2;

从某种意义上说,“订单之间的平均天数”是一个棘手的问题。您认为您必须计算每个订单与下一个订单之间的差异。

其实你只需要将从第一个订单到最后一个订单的总时间除以订单数减一即可。我可以让你弄清楚为什么会这样。

【讨论】:

  • 谢谢,我更新了我的问题。我必须在回答中使用 LAG。
  • @galleshem,为什么你必须在回答中使用LAG
【解决方案2】:

您的脚本几乎没问题。只需将客户 ID 关系添加到它。其他明智的第一行所有 eact 客户都不会为 NULL。

SELECT 
cur.Customer_ID, 
cur.Order_Date Cur,
previous.Order_Date Previous, 
DATEDIFF(day, previous.Order_Date, cur.Order_Date) [Days Between purchases]
FROM tblDifference cur
LEFT OUTER JOIN tblDifference previous 
    ON cur.RowNumber = previous.RowNumber+1 
    AND cur.customer_id = previous.customer_id;

【讨论】:

    猜你喜欢
    • 2014-09-03
    • 2023-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-20
    • 2020-11-09
    • 2020-09-01
    • 1970-01-01
    相关资源
    最近更新 更多