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

问题描述

我对这个 question

中回答的问题有疑问

你能找到解决办法吗? 如果数据 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,'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,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

解决方法

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

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,'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,rn1 - rn2 ORDER BY moddate) rn
FROM cte
ORDER BY
    custno,moddate;

Db<>fiddle