删除重复行 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_id、week_id、[=20= 的行]good_id、store_id 和 ship_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
我有一个 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_id、week_id、[=20= 的行]good_id、store_id 和 ship_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