使用 row_number 按事件分组

Group by event using row_number

我有这个table:

CREATE TABLE #Data 
(
    Event_Date date,
    Person_ID varchar(1), 
    Event_flag varchar(1)
)

INSERT INTO #Data (Event_date, Person_ID, Event_flag)
VALUES
    ('20190910', 'A', 'X'),
    ('20190911', 'A', 'X'),
    ('20190912', 'A', 'Y'),
    ('20190913', 'A', 'X'),
    ('20190914', 'A', 'X'),
    ('20190915', 'A', 'X'),
    ('20190916', 'A', 'Y')

如何使用 row_number 或循环获取结果,通过同一事件获得相同的 row_numbers,仅在其他事件上 row_number 获得 +1

Person_ID   Event_flag  Rn
--------------------------
A           X           1
A           X           1
A           Y           2
A           X           3
A           X           3
A           X           3
A           Y           4

感谢预期的 Rn 列中的计数器每次事件标志更改值时应递增 1,对于给定的人,按事件日期排序。我们可以在这里使用LAG构造一个增量列,当按事件日期求和时,将生成你想要的序列。

WITH cte AS (
    SELECT *, CASE WHEN Event_flag =
              LAG(Event_flag) OVER (PARTITION BY Person_ID ORDER BY Event_date)
                   THEN 0 ELSE 1 END AS flag
    FROM Data
)

SELECT Event_date, Person_ID, Event_flag,
       SUM(flag) OVER (ORDER BY Event_date) AS Rn
FROM cte
ORDER BY Event_date;

Demo