窗口事件

问题描述 投票:0回答:1

拿一张这样的桌子:

身份证 密钥ID RECVRID 舞台 阶段日期
834 3 61 发布日期 2023 年 11 月 19 日,星期日
834 3 61 查看日期 2023 年 11 月 20 日星期一
92 3 61 发布日期 2023 年 11 月 20 日星期一
92 3 61 发布日期 2023 年 11 月 22 日星期三
526 3 61 查看日期 2023 年 11 月 26 日,星期日
526 3 61 发布日期 2023 年 11 月 28 日星期二
835 3 61 查看日期 2023 年 11 月 30 日星期二
835 3 61 发布日期 2023 年 11 月 31 日星期二

这是一个经历一系列阶段的项目(KEYID),其中记录每个阶段的日期(STAGEDATE)。该项目始终以 PUBLISHEDDATE 开头,并分配一个 ID。然后该项目可以移动到两条路径之一。在第一个路径中,它被查看并记录 VIEWEDDATE。记录 VIEWEDDATE 后,它会被回收并被分配一个新的 ID 和新的 PUBLISHEDDATE。在第二条路径中,它永远不会被查看并被回收,这也为其分配了一个新的 ID 和 PUBLISHEDDATE。

我想要做的是构建一个新列,该列按日期对表进行排序,并在每次回收项目时分配一个序列号。所以,我想要的是:

身份证 密钥ID RECVRID 舞台 阶段日期 历史
834 3 61 发布日期 2023 年 11 月 19 日,星期日 1
834 3 61 查看日期 2023 年 11 月 20 日星期一 1
92 3 61 发布日期 2023 年 11 月 20 日星期一 2
92 3 61 发布日期 20232 年 11 月 22 日星期三 2
526 3 61 查看日期 2023 年 11 月 26 日,星期日 3
526 3 61 发布日期 2023 年 11 月 28 日星期二 3
835 3 61 查看日期 2023 年 11 月 30 日星期二 4
835 3 61 发布日期 2023 年 11 月 31 日星期二 4

我尝试过进行 DENSE_RANK,但我无法根据 ID 进行排名,因为不能保证下一个 ID 会高于上一个。

DENSE_RANK() OVER(PARTITION BY KEYID, RECVRID ORDER BY STAGEDATE) AS HISTORY

sql sql-server t-sql window-functions
1个回答
0
投票

从以下开始怎么样:

SELECT
    *,
    COUNT(CASE WHEN STAGE = 'PUBLISHEDDATE' THEN 1 END)
        OVER(PARTITION BY KeyID
             ORDER BY STAGEDATE
             --ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW -- Default
        ) AS HISTORY
FROM Data
ORDER BY STAGEDATE

结果(有一些调整的日期):

身份证 密钥ID RECVRID 舞台 阶段日期 历史
834 3 61 发布日期 2023-11-19 1
834 3 61 查看日期 2023-11-20 1
92 3 61 发布日期 2023-11-21 2
92 3 61 发布日期 2023-11-22 3
526 3 61 查看日期 2023-11-26 3
526 3 61 发布日期 2023-11-28 4
835 3 61 查看日期 2023-11-30 4
835 3 61 发布日期 2023-12-01 5

参见这个数据库<>小提琴

© www.soinside.com 2019 - 2024. All rights reserved.