SqlServer中根據(jù)某幾列獲取重復(fù)的數(shù)據(jù)將其刪除并保留最新一條
有時候,我們某個數(shù)據(jù)表中,可能有幾列的數(shù)據(jù)都是一樣的,此時我們可能想查詢出這幾列數(shù)據(jù)相同的所有數(shù)據(jù)行,并保留最新一條,將其他重復(fù)的數(shù)據(jù)刪除。
??1、ROW_NUMBER函數(shù)
假設(shè)我們有如下數(shù)據(jù)表:

此時我們可以使用ROW_NUMBER函數(shù),根據(jù)某幾列查詢出重復(fù)數(shù)據(jù)的新的排序列,該排序列就是根據(jù)某幾列重復(fù)數(shù)據(jù)生成的序號(從1開始),如下所示OrderNo就是我們新生成的列:
--根據(jù)Name和Age這2個字段進行查詢并獲得新的列OrderNo(OrderNo就是根據(jù)Name和Age重復(fù)數(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同時重復(fù)的數(shù)據(jù),并保留最新一條
DELETE FROM dbo.TestTb WHERE Id IN(
--根據(jù)Name和Age這2個字段查詢出重復(fù)的數(shù)據(jù)
SELECT Id FROM
(
--根據(jù)Name和Age這2個字段進行查詢并獲得新的列OrderNo(OrderNo就是根據(jù)Name和Age重復(fù)數(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í)行刪除:

刪除后的:

到此這篇關(guān)于SqlServer中根據(jù)某幾列獲取重復(fù)的數(shù)據(jù)將其刪除并保留最新一條的文章就介紹到這了,更多相關(guān)SqlServer獲取重復(fù)的數(shù)據(jù)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
深入分析MSSQL數(shù)據(jù)庫中事務(wù)隔離級別和鎖機制
事務(wù)隔離級別簡單的說,就是當(dāng)激活事務(wù)時,控制事務(wù)內(nèi)因SQL語句產(chǎn)生的鎖定需要保留多入,影響范圍多大,以防止多人訪問時,在事務(wù)內(nèi)發(fā)生數(shù)據(jù)查詢的錯誤。設(shè)置事務(wù)隔離級別將影響整條連接。2014-08-08
如何創(chuàng)建支持FILESTREAM的數(shù)據(jù)庫示例探討
FILESTREAM使用一種特殊類型的文件組,因此在創(chuàng)建數(shù)據(jù)庫時,必須至少為一個文件組指定 CONTAINS FILESTREAM 子句接下來為你詳細介紹下如何創(chuàng)建支持 FILESTREAM 的數(shù)據(jù)庫2013-03-03
sqlserver數(shù)據(jù)庫移動數(shù)據(jù)庫路徑的腳本示例
前段時間做過這么一件事情,把原本放在c盤的所有數(shù)據(jù)庫(除了sql server系統(tǒng)文件外)文件Move到D盤,主要是為了方便后續(xù)管理以及減少磁盤I/O阻塞(C,D是2個獨立磁盤)。腳本需輸入2個參數(shù):目標(biāo)數(shù)據(jù)庫名字和目標(biāo)目錄2013-12-12
SqlServer 英文單詞全字匹配詳解及實現(xiàn)代碼
這篇文章主要介紹了SqlServer 英文單詞全字匹配的相關(guān)資料,并附實例,有需要的小伙伴可以參考下2016-09-09

