【问题标题】:Remove duplicate rows SQL Server?删除重复行 SQL Server?
【发布时间】:2019-12-04 11:30:11
【问题描述】:

我有一个表 (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_idgood_idstore_id 的行>ship_id 列,但 quantity 为 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

【问题讨论】:

  • 请根据我更新的输入更新您的输出。

标签: sql sql-server duplicates common-table-expression


【解决方案1】:

可删除的 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 的限制即可。

【讨论】:

  • cnt >= 2 ?可能存在不止一个重复项。
  • @Serg 我在回答中对此提出了警告。给出的 OP 样本数据只显示了成对的重复项,所以我对此进行了回答。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

    在您的情况下,查询将如下所示

     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
    

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

    【讨论】:

    • @GuidoG opps 另一个条件需要
    • @TimBiegeleisen 我用 group by 可能你没注意到
    猜你喜欢
    • 2017-11-16
    • 1970-01-01
    • 1970-01-01
    • 2023-02-06
    • 2012-06-23
    • 1970-01-01
    • 1970-01-01
    • 2019-06-23
    • 2013-08-25
    相关资源
    最近更新 更多