SqlServer中根據某幾列獲取重複的資料將其刪除並保留最新一條

Qubernet發表於2024-04-28

有時候,我們某個資料表中,可能有幾列的資料都是一樣的,此時我們可能想查詢出這幾列資料相同的所有資料行,並保留最新一條,將其他重複的資料刪除。

🥇1、ROW_NUMBER函式

假設我們有如下資料表:
image

此時我們可以使用ROW_NUMBER函式,根據某幾列查詢出重複資料的新的排序列,該排序列就是根據某幾列重複資料生成的序號(從1開始),如下所示OrderNo就是我們新生成的列:

--根據Name和Age這2個欄位進行查詢並獲得新的列OrderNo(OrderNo就是根據Name和Age重複資料生成的序號,從1開始),同時按照CreateTime降序排列
SELECT *,OrderNo=ROW_NUMBER() OVER(PARTITION BY [Name],Age ORDER BY CreateTime DESC) 
FROM dbo.TestTb

image


🥈2、刪除資料

有了上述程式碼中的排序列,我們就可以知道,OrderNo的值>1的資料行都是我們需要刪除的資料,完整程式碼如下所示:

--刪除表TestTb中欄位Name和Age同時重複的資料,並保留最新一條
DELETE FROM dbo.TestTb WHERE Id IN(
    --根據Name和Age這2個欄位查詢出重複的資料
    SELECT Id FROM
    (
		--根據Name和Age這2個欄位進行查詢並獲得新的列OrderNo(OrderNo就是根據Name和Age重複資料生成的序號,從1開始),同時按照CreateTime降序排列
		SELECT *,OrderNo=ROW_NUMBER() OVER(PARTITION BY [Name],Age ORDER BY CreateTime DESC) 
		FROM dbo.TestTb
    ) Tmp
    WHERE OrderNo>1
);

執行刪除:
image

刪除後的:
image

相關文章