日期差异的 SQL Server 窗口函数

Posted

技术标签:

【中文标题】日期差异的 SQL Server 窗口函数【英文标题】:SQL Server window function for date diffs 【发布时间】:2018-07-20 19:00:08 【问题描述】:

考虑一下我有这张桌子:

// Orders

OrderId    Customer  OrderDate      
------------------------------
1          Jack      2018/05/01
2          Jack      2018/05/05
3          Jack      2018/05/15
4          Jack      2018/05/18
5          Jack      2018/05/21
6          Alex      2018/06/11
7          Alex      2018/06/12
8          Alex      2018/06/17
9          Alex      2018/06/18

我想要一个查询来在单个列中显示他们的订单之间的间隔天数,如下所示:

Customer    Gaps             GapAverage
---------------------------------------
Jack        4, 10, 3, 3      5
Alex        1, 5, 3          3

所以对于 Jack,他的 2nd 订单是在他的 1st 订单之后 4 天,他的 3rd 是 10 天 在他的 2nd 订单之后... 而他的平均间隔是 5 天。

如何在 SQL Server 中编写查询来实现这样的结果?

【问题讨论】:

为什么你认为这与窗口函数有关?你可以谷歌“sql server string aggregation”。 @GordonLinoff 因为我希望将它们分组,并且每个组都应该进行排序,并且每个值都应该根据其前一行进行计算。仅使用字符串聚合怎么可能做到这一点? 。 . SQL Server 2017中的函数是string_agg():docs.microsoft.com/en-us/sql/t-sql/functions/…。 @GordonLinoff 如何聚合thisRow.OrderDate - previousRow.OrderDate @mehrandvd 如果您需要将 STRING_AGG 替换为其他替代功能,请告诉我。在这种情况下,我将编辑我的答案。 【参考方案1】:

我收到了这样的询问

select q1.Customer, 
       STRING_AGG(q1.diff, ',') as Gaps, 
       AVG(diff) as GapAverage
from ( select Customer as Customer, 
       DATEDIFF(dd, [OrderDate], LEAD([OrderDate]) OVER (PARTITION  BY Customer ORDER  BY Customer)) as diff
       from OrderT) as q1
group by q1.Customer

我正在使用LEAD 函数来访问当前行之后的行。使用此函数的 OVER 参数,我将结果按 Customer 字段分组。使用 DATEDIFF 函数我得到了几天的差距。

【讨论】:

请注意,STRING_AGG 仅在 MSSQL 2017 及更高版本中可用。如果你不使用 MSSQL 2017,你需要做一些棘手的事情red-gate.com/simple-talk/sql/t-sql-programming/…。 STRING_AGG 在 Azure 中很好

以上是关于日期差异的 SQL Server 窗口函数的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server2008窗口计算

SQL Server:具有不同长度的分析窗口函数

在 Spark SQL 中使用窗口函数结束日期记录

SQL 窗口函数

SQL滑动窗口聚合(不使用窗口函数)

创建“部分”窗口函数以更新 SQL Server 中的数据