我如何分组 / window 由任意表达式描述的日期排序事件?

How can I group / window date ordered events delineated by an arbitrary expression?

我想根据日期和一些(可能是任意的)指标将一些数据分组在一起:

Date       | Ind
================
2016-01-02 | 1
2016-01-03 | 5
2016-03-02 | 10
2016-03-05 | 15
2016-05-10 | 6
2016-05-11 | 2

我想将后续(按日期排序的)行组合在一起,但在 Indicator >= 10:

之后打破分组
Date       | Ind | Group
========================
2016-01-02 | 1   |   1
2016-01-03 | 5   |   1
2016-03-02 | 10  |   1

2016-03-05 | 15  |   2

2016-05-10 | 6   |   3
2016-05-11 | 2   |   3

我确实在博客的末尾找到了一个很有前途的技术 post:“Use this Neat Window Function Trick to Calculate Time Differences in a Time Series”(最后一小节,"Extra Bonus"),但是查询的重要部分使用SQL 服务器似乎不支持的关键字 (FILTER)(以及稍后的 Google,我不确定它在哪里受支持!)。

我仍然希望使用 window 函数的技术可能是答案。我只需要一个可以添加到每一行的计数器(就像 RANKROW_NUMBER 那样),但它只会在某些任意条件的计算结果为 true 时递增。有没有办法在 SQL 服务器中执行此操作?

解决方法如下:

DECLARE @t TABLE ([Date] DATETIME, Ind INT)

INSERT INTO @t 
VALUES
('2016-01-02', 1),
('2016-01-03', 5),
('2016-03-02', 10),
('2016-03-05', 15),
('2016-05-10', 6),
('2016-05-11', 2)

SELECT [Date],
       Ind,
       1 + SUM([Group]) OVER(ORDER BY [Date]) AS [Group]
FROM 
(
    SELECT  *, 
            CASE WHEN LAG(ind) OVER(ORDER BY [Date]) >= 10 
                THEN 1 
                ELSE 0 
            END AS [Group] 
      FROM @t
) t

当上一个大于 10 时,只需将行标记为 1,否则 0。然后运行总和会给你想要的结果。

这个想法完全归功于 Giorgi,但我修改了他的答案(为了我和未来的读者)。

只需更改 CASE 语句即可查看自上次记录以来是否已过去 30 天或更长时间:

DECLARE @t TABLE ([Date] DATETIME)

INSERT INTO @t 
VALUES
('2016-01-02'),
('2016-01-03'),
('2016-03-02'),
('2016-03-05'),
('2016-05-10'),
('2016-05-11')

SELECT [Date],
       1 + SUM([Group]) OVER(ORDER BY [Date]) AS [Group]
FROM 
(
    SELECT  [Date], 
            CASE WHEN DATEADD(d, -30, [Date]) >= LAG([Date]) OVER(ORDER BY [Date])
                THEN 1 
                ELSE 0 
            END AS [Group] 
      FROM @t
) t