删除重复行 SQL 服务器?

Remove duplicate rows SQL Server?

我有一个 table (SQL Server 2017) 的销售数据包含重复行,例如:

+---------+---------+---------+----------+---------+----------+
| year_id | week_id | good_id | store_id | ship_id | quantity |
+---------+---------+---------+----------+---------+----------+
| 2017    | 43      | 154876  | 19       | 6       | 2        |
+---------+---------+---------+----------+---------+----------+
| 2017    | 43      | 154876  | 19       | 6       | 0        |
+---------+---------+---------+----------+---------+----------+
| 2019    | 32      | 456123  | 67       | 4       | 6        |
+---------+---------+---------+----------+---------+----------+
| 2019    | 32      | 456123  | 67       | 4       | 4        |
+---------+---------+---------+----------+---------+----------+
| 2019    | 32      | 456123  | 67       | 4       | 0        |
+---------+---------+---------+----------+---------+----------+
| 2018    | 32      | 456123  | 67       | 4       | 0        |
+---------+---------+---------+----------+---------+----------+

我想删除具有相同 year_idweek_id、[=20= 的行]good_id、store_idship_id 列,但是 数量为0,例如:

+---------+---------+---------+----------+---------+----------+
| year_id | week_id | good_id | store_id | ship_id | quantity |
+---------+---------+---------+----------+---------+----------+
| 2017    | 43      | 154876  | 19       | 6       | 2        |
+---------+---------+---------+----------+---------+----------+
| 2019    | 32      | 456123  | 67       | 4       | 6        |
+---------+---------+---------+----------+---------+----------+

我找到了可以做到这一点的查询,但我不明白如何指示我需要删除数量等于 0 的行。

WITH CTE AS(
   SELECT year_id, week_id, good_id, store_id, ship_id,
       RN = ROW_NUMBER()OVER(PARTITION BY year_id ORDER BY year_id)
   FROM dbo.sales
)
DELETE FROM CTE WHERE RN > 1

在您的案例中,查询如下所示

 WITH CTE AS(
       SELECT year_id, week_id, good_id, store_id, ship_id,
           RN = ROW_NUMBER()OVER(PARTITION BY year_id, week_id, good_id, store_id, ship_id ORDER BY quantity)
, count(*) as cnt
       FROM dbo.sales group by year_id, week_id, good_id, store_id, ship_id
    )
    DELETE FROM CTE WHERE RN = 1 and quantity=0 and cnt>1

如果您只想复制 quantity=0,那么您需要在 where 条件中使用 quantity=0,否则您可以从 where

中删除该条件

可删除的 CTE 已步入正轨。这是一种方法:

WITH cte AS (
    SELECT *, COUNT(*) OVER (PARTITION BY year_id, week_id, good_id, store_id, ship_id) cnt
    FROM dbo.sales
)

DELETE
FROM cte
WHERE cnt = 2 AND quantity = 0;

这将删除与您提到的五列相关且数量为零的所有重复记录。如果您还想满足大于对的重复项,只需更改 cnt.

的限制

WITH CTE AS ( SELECT year_id, week_id, good_id, store_id, ship_id,Quantity , ROW_NUMBER() OVER (PARTITION BY year_id, week_id, good_id, store_id, ship_id ORDER BY quantity Desc) RN FROM dbo.sales ) DELETE FROM CTE WHERE RN > 1 And Quantity = 0