使用 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;
我有这个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;