T-SQL CTE 获取具有键值分隔的 ROW_NUMBER() OVER PARTITION

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

我有 CTE 来根据 NAME、VAL1 和 VAL2 列获取数字,然后按 DT 日期降序排列。

WITH cteA (NAME, VAL1, VAL2, DT) AS 
(
    SELECT 'A', '7100', 'PN1', '2023-03-01' UNION
    SELECT 'A', '7100', 'PN1', '2023-01-01' UNION
    SELECT 'A', '7100', 'PN3', '2022-09-01' UNION
    SELECT 'A', '7100', 'PN1', '2022-05-20' UNION
    SELECT 'A', '7100', 'PN1', '2022-05-09' UNION
    SELECT 'A', '7100', 'PN1', '2022-08-20'
), 
cteB AS 
(
    SELECT 
        *,
        ROW_NUMBER() OVER (PARTITION BY NAME, VAL1, VAL2 
                           ORDER BY DT DESC) ROWNUMBER
    FROM cteA
)
SELECT *
FROM cteB
ORDER BY DT DESC

但是当我使用

ROW_NUMBER OVER PARTITION BY NAME, VAL1
时,VAL2 给出的数字不是我想要的:

姓名 VAL1 VAL2 DT 行号
A 7100 PN1 2023-03-01 1
A 7100 PN1 2023-01-01 2
A 7100 PN3 2022-09-01 1
A 7100 PN1 2022-08-20 3
A 7100 PN1 2022-05-20 4
A 7100 PN1 2022-05-09 5

我需要用 VAL2 列分隔数字:PN1(PN3 之前)、PN3 本身和 VAL2 上的 PN1(PN3 之后), 保持DT下降, 并得到这样的结果行号:

姓名 VAL1 VAL2 DT 行号
A 7100 PN1 2023-03-01 1
A 7100 PN1 2023-01-01 1
A 7100 PN3 2022-09-01 2
A 7100 PN1 2022-08-20 3
A 7100 PN1 2022-05-20 3
A 7100 PN1 2022-05-09 3
sql-server tsql partition row-number sql-server-2019
© www.soinside.com 2019 - 2024. All rights reserved.