成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

SQL Server 中處理重復數據:保留最新記錄的兩種方案

數據庫 SQL Server
大家在項目開發過程中,數據庫幾乎是每一個后端開發者必備的技能,并且經常會遇到對于數據表重復數據的處理,一般需要去除重復保留最新的記錄。今天這里給大家分享兩種種方案,希望對大家日常開發能夠提供一些幫助!

大家在項目開發過程中,數據庫幾乎是每一個后端開發者必備的技能,并且經常會遇到對于數據表重復數據的處理,一般需要去除重復保留最新的記錄。今天這里給大家分享兩種種方案,希望對大家日常開發能夠提供一些幫助!

首先準備測試的數據表

創建一個包含ID, OrderDate, ProductName以及可選的SequenceID的商品購買記錄表Sales。

CREATE TABLE Sales
(
    ID INT IDENTITY(1,1) PRIMARY KEY,
    OrderDate DATE NOT NULL,
    ProductName VARCHAR(100) NOT NULL, 
    SequenceID INT IDENTITY(1,1)
);

-- 訂單日期增加當前日期默認值約束
ALTER TABLE Sales ADD DEFAULT (GETDATE()) FOR OrderDate;

準備一些測試數據。

INSERT INTO Sales (OrderDate, ProductName)
VALUES 
    ('2023-04-01', '筆記本X1'), -- 示例商品A的最早購買日期
    ('2023-04-07', '智能手機Y7'),
    ('2023-04-15', '平板電腦Z3'),
    ('2023-04-09', '筆記本X1'), -- 商品A的第二次購買,較早日期
    ('2023-04-08', '智能手機Y7'), -- 商品B的第二次購買,較早日期
    ('2023-04-20', '平板電腦Z3'), -- 商品C的第二次購買,較晚日期
    ('2023-04-18', '筆記本X1'), -- 商品A的第三次購買,最新日期
    ('2023-04-22', '智能手機Y7 Pro'), -- 新產品,不同型號
    ('2023-04-25', '平板電腦Z3 Plus'), -- 新產品,不同型號
    ('2023-04-24 14:30:00', '筆記本X1'), -- 同日但較早時間的重復記錄
    ('2023-04-24 15:45:00', '筆記本X1'); -- 同日但較晚時間的記錄,應被視為最新

查詢效果如下:

方案一. 使用ROW_NUMBER()函數刪除重復項

ROW_NUMBER()函數是SQL Server中處理重復數據的強大工具之一,可以通過窗口函數來為每一組重復數據分配行號,然后保留每組數據中最新的一條記錄。

示例SQL語句:

假設有一個表Sales,包含ID, OrderDate, ProductName等字段,其中ID為主鍵,但ProductName和OrderDate上有重復數據,我們要保留每個產品的最新訂單記錄。

-- 查詢不是最新的重復記錄直接刪除
WITH CTE AS (
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY ProductName ORDER BY OrderDate DESC) AS RowNum
    FROM Sales
)
DELETE FROM CTE
WHERE RowNum > 1;
-- 數據庫不操作直接查詢每一行不重復的最新記錄
WITH CTE AS (
    SELECT *,
           ROW_NUMBER() OVER(PARTITION BY ProductName ORDER BY OrderDate DESC) AS RowNum
    FROM Sales
)
select * FROM CTE
WHERE RowNum = 1;

執行效果如下:

SQL說明:

PARTITION BY ProductName:按照ProductName對數據分組。

ORDER BY OrderDate DESC:在每個分組內按OrderDate降序排序,確保最新記錄排在首位。

ROW_NUMBER():為每組內的記錄分配一個行號,最新的記錄行號為1。

刪除重復記錄:在CTE中刪除RowNum大于1的記錄,即除了每個分組最新的一條記錄外,其余視為重復并刪除。

直接查詢:針對CTE篩選RowNum等于1的記錄

方案二. 使用臨時表的方式

第二種方法是使用臨時表來篩選并保留最新記錄。具體步驟如下:

創建臨時表:首先,創建一個臨時表,結構與原表相同,用于存儲去重后的數據。

使用MERGE語句:通過MERGE語句將原表數據與臨時表數據進行比較,保留每個唯一標識下的最新記錄。

INSERT INTO #TempSales
SELECT ID, OrderDate, ProductName
FROM (
    SELECT *, ROW_NUMBER() OVER(PARTITION BY ProductName ORDER BY OrderDate DESC) AS rn
    FROM Sales
) t
WHERE t.rn = 1;

select * from #TempSales; -- 直接查詢就是去重后保留最新記錄的查詢數據

TRUNCATE TABLE Sales; -- 清空原表
-- 重新插入臨時表的數據給Sales。適用數據量不是特別大的情況
INSERT INTO Sales
SELECT * FROM #TempSales;

DROP TABLE #TempSales; -- 刪除臨時表

說明:

該方案先通過臨時表存儲每個產品的最新記錄,然后清空原表,并將臨時表中的數據重新插入原表,最終達到保留最新記錄的目的。直接查詢臨時表就是所需要的數據。

責任編輯:姜華 來源: 小明互聯網技術分享社區
相關推薦

2010-07-01 12:29:27

SQL Server重

2010-09-28 15:46:22

SQL刪除重復記錄

2010-09-02 10:36:51

SQL刪除

2010-07-08 13:06:05

SQL Server刪

2010-07-21 11:38:59

SQL Server重

2010-07-26 09:55:55

SQL Server重

2010-07-23 15:09:42

SQL Server刪

2010-07-23 16:21:37

SQL Server重

2010-10-21 16:24:18

sql server升

2010-06-30 13:07:17

SQL Server函

2010-10-20 15:48:56

SQL Server許

2010-10-21 16:38:27

sql server文

2010-07-08 13:20:05

SQL Server刪

2024-10-16 18:09:54

2010-07-07 16:53:54

SQL Server重

2011-04-06 11:05:21

SQL Server數交換數據

2024-10-16 17:04:13

2009-04-03 09:00:20

SQL Server2005用戶

2021-11-30 10:00:01

SQL數據重復

2010-07-14 10:24:25

SQL Server獲
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 国产91久久久久久久免费 | 久久久久国产一区二区三区 | 国产精品视频网 | 国产成人免费在线 | 亚洲视频在线观看一区二区三区 | 99热精品在线观看 | 在线观看成人小视频 | 午夜视频免费在线观看 | 综合一区二区三区 | 九九热这里只有精品在线观看 | www.日本国产 | 成人免费在线播放 | 91精品国产综合久久精品 | 奇米av | 亚洲精品一区二区在线观看 | 色在线免费视频 | www精品美女久久久tv | 久久久综合网 | 国产91在线 | 欧美 | 久久亚洲一区二区 | 成人三级在线观看 | 久久这里只有精品首页 | 欧美一区二区三区在线观看 | 亚州精品天堂中文字幕 | 日韩中文字幕一区二区三区 | 久久久www成人免费精品 | 亚洲高清一区二区三区 | 亚洲人人 | 色爱综合网 | 亚洲欧洲一区 | 欧美精品久久久久久久久老牛影院 | 在线欧美亚洲 | 国产精品久久久久久久久免费软件 | 精品一区二区三区在线视频 | 欧美成人在线网站 | 国产一区二区精品自拍 | 亚洲精品久久久久久一区二区 | 亚洲日本中文字幕在线 | 国产精品久久久久久久久久久久 | 精品久久香蕉国产线看观看亚洲 | 色888www视频在线观看 |