在值更改时重置行号,但在分区中重复值

Reset Row Number on value change, but repeat values in partition

我对这个

中回答的问题有疑问

你能找到解决办法吗? 这是错误的结果 rn 列如果数据 chr 像这样

WITH chr AS (
    SELECT 581827 AS custno, '2012-11-08 08:38:00.000' AS moddate, 'EMSZC14' AS who UNION ALL
    SELECT 581827, '2012-11-08 09:14:18.000', 'EMSZC49' UNION ALL
    SELECT 581827, '2012-11-08 09:17:35.000', 'EMSZC14' UNION ALL  -- It is Fail
    SELECT 581827, '2012-11-08 09:17:35.000', 'EMSZC14'   -- It is Fail
),
cte AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY custno ORDER BY moddate) rn1,
        ROW_NUMBER() OVER (PARTITION BY custno, who ORDER BY moddate) rn2
    FROM chr
)

SELECT custno, moddate, who,
    ROW_NUMBER() OVER (PARTITION BY custno, rn1 - rn2 ORDER BY moddate) rn
FROM cte
ORDER BY
    custno,
    moddate;

错误结果:

custno  moddate who rn
581827  2012-11-08 08:38:00.000 EMSZC14 1
581827  2012-11-08 09:14:18.000 EMSZC49 1
581827  2012-11-08 09:17:35.000 EMSZC14 2
581827  2012-11-08 09:17:35.000 EMSZC14 3

预期结果:

custno  moddate who rn
581827  2012-11-08 08:38:00.000 EMSZC14 1
581827  2012-11-08 09:14:18.000 EMSZC49 1
581827  2012-11-08 09:17:35.000 EMSZC14 1
581827  2012-11-08 09:17:35.000 EMSZC14 2

你只需要在最后的row_number中添加who如下:

WITH chr AS (
    SELECT 581827 AS custno, '2012-11-08 08:38:00.000' AS moddate, 'EMSZC14' AS who UNION ALL
    SELECT 581827, '2012-11-08 09:14:18.000', 'EMSZC49' UNION ALL
    SELECT 581827, '2012-11-08 09:17:35.000', 'EMSZC14' UNION ALL  -- It is Fail
    SELECT 581827, '2012-11-08 09:17:35.000', 'EMSZC14'   -- It is Fail
),
cte AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY custno ORDER BY moddate) rn1,
        ROW_NUMBER() OVER (PARTITION BY custno, who ORDER BY moddate) rn2
    FROM chr
)

SELECT custno, moddate, who,
    ROW_NUMBER() OVER (PARTITION BY custno, who, rn1 - rn2 ORDER BY moddate) rn
FROM cte
ORDER BY
    custno,
    moddate;

Db<>fiddle