在值更改时重置行号,但在分区中重复值
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;
我对这个
你能找到解决办法吗?
这是错误的结果 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;