我正在为客户端创建存储过程。但是,我的表有重复行,只有一个不同,如下所示:
Id LastName Total_Pay Holiday_Pay Total_Earning
617A06 KAZMIEK 0 139.45 139.45
617A06 KAZMIEK 284.3 139.45 423.75
617A0 NIZIO 172 0 172
00178 SZWAJKOWSKA 0 181.03 181.03
现在我使用以下代码查看哪一行是重复的:
WITH CTE AS
(SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY tax_period, id ORDER BY tax_period)
FROM #worker_totals)
select *
FROM CTE
它给了我正确的结果:
id name total_pay holiday_pay total_earning rn
617A06 KAZMIEK 0 139.45 139.45 1
617A06 KAZMIEK 284.3 139.45 423.75 2
617A0 NIZIO 172 0 172 1
00178 SZWAJKOWSKA 0 181.03 181.03 1
现在第一行是错误的,因为总薪水应该是284.3,应该为同一个人重复。 60多条记录也发生了同样的情况。如何为同一个拥有rn2的人删除rn 1,因为rn1错误,因为同一个人有rn2。
我尝试了以下内容:
Delete From cte
Where rn > 1;
但我不是我想要的。我想删除相同id的rn = 2时的rn = 1。
答案 0 :(得分:2)
您目前正在按tax_period ASC
排序(升序部分是隐含的,因为没有指定方向)。因此,后来的'税收期可能比之前更准确,总是排第2行。
如果您在DESC
中指定ORDER BY
,则最新的可用纳税期限始终为第1行。这意味着您应该能够删除任何rn > 1
。
对于只有1个句点的记录,您不会删除任何内容。对于具有多个期间的记录,您将删除除最新可用期之外的所有记录。
WITH CTE AS
(
SELECT
*,
RN=ROW_NUMBER() OVER(PARTITION BY tax_period, id ORDER BY tax_period DESC)
FROM #worker_totals
)
DELETE *
FROM CTE
WHERE RN > 1;
答案 1 :(得分:0)
WITH CTE AS
(SELECT *,RN=ROW_NUMBER() OVER(PARTITION BY tax_period, id ORDER BY tax_period)
FROM #worker_totals),
CTEMoreThanOne AS (SELECT * FROM CTE WHERE rn>1)--or=2
DELETE c1 FROM
CTE c1 INNER JOIN CTEMoreThanOne c2 ON c1.Id = c2.Id
WHERE c1.rn=1