[英]Row number with lag event partition
我想插入一个由上一个标志划分的行号。
我曾尝试在分区中使用lag函数,但在使用NULL时遇到了挑战。
我可以通过LAG和LEAD函数以及其他键标志确定的多个日期差来确定X的不同块。 因此,LAG和LEAD列中的每个0表示行已“链接”。
我的表看起来像这样,我希望行号在X的第二个块处重新开始:
Person_ID Event_flag Row_number LAG_datediff LEAD_datediff FLAG FLAG2
A X 1 NULL 0 1 NULL
A X 2 0 40 NULL NULL
A Y 1 40 150 NULL NULL
A X 1 150 0 1 NULL
A X 2 0 NULL NULL 1
您需要一个排序列来对行进行编号。 没有样本数据很难,但是如果您的表是按一个date
列排序的,那么下一种方法可能有助于获得预期的结果:
数据:
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')
声明:
;WITH ChangesCTE AS (
SELECT
Event_Date,
Person_ID,
Event_flag,
CASE
WHEN Event_flag = LAG(Event_flag) OVER (ORDER BY Event_Date) THEN 0
ELSE 1
END AS Change_ID
FROM #Data
), GroupsCTE AS (
SELECT
Event_Date,
Person_ID,
Event_flag,
SUM([Change_ID]) OVER (ORDER BY Event_Date) AS Group_ID
FROM ChangesCTE
)
SELECT
Person_ID,
Event_flag,
ROW_NUMBER() OVER (PARTITION BY Group_ID ORDER BY Event_Date) AS Rn
FROM GroupsCTE
输出:
--------------------------
Person_ID Event_flag Rn
--------------------------
A X 1
A X 2
A Y 1
A X 1
A X 2
A X 3
A Y 1
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.