有時候,我們某個資料表中,可能有幾列的資料都是一樣的,此時我們可能想查詢出這幾列資料相同的所有資料行,並保留最新一條,將其他重複的資料刪除。
🥇1、ROW_NUMBER函式
假設我們有如下資料表:
此時我們可以使用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
🥈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
);
執行刪除:
刪除後的: