有時候,我們某個數(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í)行刪除:文章來源:http://www.zghlxwxcb.cn/news/detail-860799.html
刪除后的:文章來源地址http://www.zghlxwxcb.cn/news/detail-860799.html
到了這里,關(guān)于SqlServer中根據(jù)某幾列獲取重復(fù)的數(shù)據(jù)將其刪除并保留最新一條的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!