日期差异的 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 窗口函数的主要内容,如果未能解决你的问题,请参考以下文章