繁体   English   中英

具有滞后事件分区的行号

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM