某些行共享相同的主鍵(ID),但行的其餘部分可能不同。例如,如何刪除重複行
ID Age Info
2 21 2763
2 21 6276
3 31 82756
在這種情況下,第一行和第二行都具有相同的ID和年齡,但信息不同。我想要做的重複ID行是隨機保留其中一個,並刪除其他人。我在我的數據集中有這麼多種記錄,所以我無法逐一刪除它們。有沒有解決方法?由於
某些行共享相同的主鍵(ID),但行的其餘部分可能不同。例如,如何刪除重複行
ID Age Info
2 21 2763
2 21 6276
3 31 82756
在這種情況下,第一行和第二行都具有相同的ID和年齡,但信息不同。我想要做的重複ID行是隨機保留其中一個,並刪除其他人。我在我的數據集中有這麼多種記錄,所以我無法逐一刪除它們。有沒有解決方法?由於
我認爲你在尋找這樣的事情:
delete from TableName where info not in
(select min(info) from TableName group by ID,Age);
嘗試select語句首先要確保它返回正確的行,然後刪除部分添加到它
讓我試試吧!感謝您的答覆! –
這隻會在'info'是唯一的時候才起作用。一行ID = 2,Info = 82756會拋棄它。 –
正確,每個示例的假設是Info對於每個分組標識和年齡都是唯一的。 –
試試這個:
DELETE t1
FROM mytable AS t1
INNER JOIN mytable AS t2
ON t1.ID = t2.ID AND t1.Age = t2.Age AND t1.Info > t2.Info
以上應該在MySQL,SQL Server中工作。該語句將刪除(ID, Age)
切片中的所有行,但會刪除值中最小的那個。
注意:上述工作規定Info
值是唯一的每(ID, Age)
切片。
我會建議一個基於集合的解決方案,但我無法照顧所有3行相同的行。因此建議使用ROWCOUNT和while循環的解決方案。 ROWCOUNT將確保一次只刪除一條記錄。 while循環是這樣的,你不必一個一個地手動完成。
SET ROWCOUNT 1
DECLARE @ctr INT
SELECT TOP 1 @ctr = COUNT(*) FROM table GROUP BY ID HAVING COUNT(*) > 1 ORDER BY COUNT(*) desc
SELECT @ctr
WHILE @ctr > 1
BEGIN
DELETE FROM table WHERE ID IN (SELECT ID FROM table GROUP BY ID HAVING COUNT(*) > 1)
SELECT @ctr = NULL
SELECT TOP 1 @ctr = COUNT(*) FROM table GROUP BY ID HAVING COUNT(*) > 1 ORDER BY COUNT(*) desc
If @Ctr IS NULL
Break
ELSE
Continue
END
SET ROWCOUNT 0
您可以在刪除語句中更改order by語句以滿足您的要求。
試試這個。執行前執行備份。 – Adish
用窗函數:
;with cte as(select *, row_number() over(partition by id order by info) rn
from table)
delete from cte where rn <> 1
什麼是RDBMS? – SQLChao
哪個是你在這張表中的主鍵? – Adish
在這個例子中@Adish PK是ID。謝謝 –