删除ID相同的重复列

时间:2018-02-01 16:37:35

标签: sql-server tsql

我正在为客户端创建存储过程。但是,我的表有重复行,只有一个不同,如下所示:

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。

2 个答案:

答案 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