我在SQL中有下表,其中包含以下订单行:
RowId OrderId Type Text
----------------------------------------
1 1 5 "Sometext"
2 1 5 "Sometext"
3 2 4 "Sometext"
4 3 5 "Sometext"
5 2 4 "Sometext"
6 1 3 "Sometext"
每个订单都不能有重复的类型,但可以有多种不同的类型。
第1行和第2行与订单 1 重复,但第6行正常。
第3行和第5行与订单 2 重复。
我需要删除所有重复的数据,因此在这种情况下我需要删除第2行和第5行。
删除数据的最佳查询是什么?或者甚至只返回包含要删除的重复项的 RowID 的列表(或者相反,要保留 RowID 的列表)?
感谢。
答案 0 :(得分:3)
尝试一种简单的方法:
DELETE FROM t
WHERE rowid NOT IN (
SELECT min(rowid) FROM t
GROUP BY orderid, type
)
小提琴here。
请注意,您似乎希望在重复时保持较低的rowid
。这就是为什么我要保留min
。
答案 1 :(得分:1)
;with cte as
(
Select Row_Number() Over(Partition BY ORDERID,TYPE ORDER BY RowId) as Rows,
RowId , OrderId , Type , Text from TableName
)
Select RowId , OrderId , Type , Text from cte where Rows>1
答案 2 :(得分:1)
请尝试:
with c as
(
select *, row_number() over(partition by OrderId, Type order by (select 0)) as n
from YourTable
)
delete from c
where n > 1;