问题描述
我对这个 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;