SqlServer中根據(jù)某幾列獲取重復的數(shù)據(jù)將其刪除并保留最新一條
有時候,我們某個數(shù)據(jù)表中,可能有幾列的數(shù)據(jù)都是一樣的,此時我們可能想查詢出這幾列數(shù)據(jù)相同的所有數(shù)據(jù)行,并保留最新一條,將其他重復的數(shù)據(jù)刪除。
??1、ROW_NUMBER函數(shù)
假設我們有如下數(shù)據(jù)表:
此時我們可以使用ROW_NUMBER
函數(shù),根據(jù)某幾列查詢出重復數(shù)據(jù)的新的排序列,該排序列就是根據(jù)某幾列重復數(shù)據(jù)生成的序號(從1開始),如下所示OrderNo
就是我們新生成的列:
--根據(jù)Name和Age這2個字段進行查詢并獲得新的列OrderNo(OrderNo就是根據(jù)Name和Age重復數(shù)據(jù)生成的序號,從1開始),同時按照CreateTime降序排列 SELECT *,OrderNo=ROW_NUMBER() OVER(PARTITION BY [Name],Age ORDER BY CreateTime DESC) FROM dbo.TestTb
??2、刪除數(shù)據(jù)
有了上述代碼中的排序列,我們就可以知道,OrderNo
的值>1的數(shù)據(jù)行都是我們需要刪除的數(shù)據(jù),完整代碼如下所示:
--刪除表TestTb中字段Name和Age同時重復的數(shù)據(jù),并保留最新一條 DELETE FROM dbo.TestTb WHERE Id IN( --根據(jù)Name和Age這2個字段查詢出重復的數(shù)據(jù) SELECT Id FROM ( --根據(jù)Name和Age這2個字段進行查詢并獲得新的列OrderNo(OrderNo就是根據(jù)Name和Age重復數(shù)據(jù)生成的序號,從1開始),同時按照CreateTime降序排列 SELECT *,OrderNo=ROW_NUMBER() OVER(PARTITION BY [Name],Age ORDER BY CreateTime DESC) FROM dbo.TestTb ) Tmp WHERE OrderNo>1 );
執(zhí)行刪除:
刪除后的:
到此這篇關于SqlServer中根據(jù)某幾列獲取重復的數(shù)據(jù)將其刪除并保留最新一條的文章就介紹到這了,更多相關SqlServer獲取重復的數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
查詢SQL Server數(shù)據(jù)庫服務器IP地址的多種有效方法
作為數(shù)據(jù)庫管理員或開發(fā)人員,了解如何查詢SQL Server數(shù)據(jù)庫服務器的IP地址是一項重要技能,本文將介紹幾種簡單而有效的方法,幫助你輕松獲取這一信息,無論你是新手還是經(jīng)驗豐富的專業(yè)人士,這些方法都能為你提供所需的信息,需要的朋友可以參考下2025-02-02如何通過sysprocesses 簡單查詢死鎖及解決死鎖最新方案(四步解決)
這篇文章主要介紹了如何通過sysprocesses 簡單查詢死鎖及解決死鎖最新方案,本文分四步幫助大家成功解決,需要的朋友可以參考下2024-02-02設定sql server定期自動備份數(shù)據(jù)庫
設定sql server定期自動備份數(shù)據(jù)庫...2007-01-01SQL中去除重復數(shù)據(jù)的幾種方法匯總(窗口函數(shù)對數(shù)據(jù)去重)
以某電商公司的銷售報表為例,常見的去重方法我們用到distinct 或者group by 語句, 今天介紹一種新的方法,利用窗口函數(shù)對數(shù)據(jù)去重,感興趣的朋友跟隨小編一起看看吧2023-05-05Sql Server 2012 轉換函數(shù)的比較(Cast、Convert和Parse)
Cast、Convert 和 Parse 都是 Sql Server 2012 中的內(nèi)置轉換函數(shù),其作用是:一種數(shù)據(jù)類型轉換為另一種數(shù)據(jù)類型。其中前兩者的差別較小,但 Parse 為 Sql Server 2012 新增函數(shù),也是最近在分析 Sql Server 2012 新特性的時間,才有想把這3個函數(shù)拿出來進行比較分析的想法2012-07-07