拿一张这样的桌子:
身份证 | 密钥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
从以下开始怎么样:
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 |
参见这个数据库<>小提琴。