SQL server 重複數據處理 (根據條件篩選符合merge的數據)

假定一個表裏有各種各樣的花式重複數據、
在sqlserver中如何去重是一個問題、
如果在oracle 中、存在隱藏列rowid 我們可以這樣

select * from tab1  where rowid in (
select min(rowid) from tab1 group by  cloumn1,cloumn2,cloumn3 );

但是在sqlserver中沒有rowid這一列、
那麼問題來了、 sqlserver中怎麼搞?


舉個例子:
創建一個測試表:

CREATE TABLE [dbo].[z_test](
    [id] [uniqueidentifier] NULL DEFAULT (newid()),
    [num] [int] NULL,
    [name] [varchar](50) NULL,
    [CreatedAt] [datetime] NULL DEFAULT (getdate())
) ON [PRIMARY]

插入測試數據:


GO
SET ANSI_PADDING OFF
GO
INSERT [dbo].[z_test] ([id], [num], [name], [CreatedAt]) VALUES (N'9806498c-b51e-4dda-b90c-7dc7daf571cb', 1, N'zzz', CAST(N'2018-08-15 15:51:37.253' AS DateTime))
GO
INSERT [dbo].[z_test] ([id], [num], [name], [CreatedAt]) VALUES (N'0cf2e5e0-85d9-4d0e-8d75-252577e5cc2c', 2, N'aaa', CAST(N'2018-08-15 15:51:53.243' AS DateTime))
GO
INSERT [dbo].[z_test] ([id], [num], [name], [CreatedAt]) VALUES (N'237d5e8e-cf12-44a1-b52f-16118fd2289f', 3, N'zzz', CAST(N'2018-08-15 15:52:03.210' AS DateTime))
GO
INSERT [dbo].[z_test] ([id], [num], [name], [CreatedAt]) VALUES (N'03981fd4-11d0-4392-82b1-6135a45f87d5', 1, N'zzz', CAST(N'2018-08-15 15:52:08.203' AS DateTime))
GO
INSERT [dbo].[z_test] ([id], [num], [name], [CreatedAt]) VALUES (N'603607d1-9c3b-4c96-8be7-9db6465e5529', 2, N'aaa', CAST(N'2018-08-15 15:52:17.290' AS DateTime))
GO
INSERT [dbo].[z_test] ([id], [num], [name], [CreatedAt]) VALUES (N'e7419773-a55d-4bf8-9283-5f7d7f9ffa45', 4, N'bbb', CAST(N'2018-08-15 15:52:28.897' AS DateTime))
GO
INSERT [dbo].[z_test] ([id], [num], [name], [CreatedAt]) VALUES (N'237d5e8e-cf12-44a1-b52f-16118fd2289f', 3, N'zzz', CAST(N'2018-08-15 15:52:03.210' AS DateTime))
GO
INSERT [dbo].[z_test] ([id], [num], [name], [CreatedAt]) VALUES (N'6bc4b059-e1aa-4bff-a8c2-19697ab800e1', 4, N'bbb', CAST(N'2018-08-15 15:55:59.550' AS DateTime))
GO
INSERT [dbo].[z_test] ([id], [num], [name], [CreatedAt]) VALUES (N'0cf2e5e0-85d9-4d0e-8d75-252577e5cc2c', 2, N'ccc', CAST(N'2018-08-15 15:51:53.243' AS DateTime))
GO

結果如下:

select * from z_test 

這裏寫圖片描述


num與name唯一 保留創建時間最晚的一條

SELECT * FROM z_test z WHERE NOT EXISTS ( SELECT 1 FROM z_test WHERE num=z.num  AND name=z.name AND   CreatedAt > z.CreatedAt  ) ORDER BY num

結果如下:
這裏寫圖片描述

這樣還不夠、 還有創建時間和ID一樣的、 怎麼會出現這樣的數據呢、 哎、 誰知道呢、 一切皆有可能

那我們這樣做:

WITH ztest1 AS (
SELECT * FROM z_test z WHERE NOT EXISTS ( SELECT 1 FROM z_test WHERE num=z.num  AND name=z.name AND   CreatedAt > z.CreatedAt  )  )
SELECT DISTINCT  * FROM ztest1  ORDER BY num

這裏寫圖片描述


或許還有多種情況、請自行舉一反三、


重點

SELECT * FROM table_name z WHERE NOT EXISTS ( SELECT 1 FROM table_name WHERE cloumn1=z.cloumn1(去重條件) AND cloumn2> z.cloumn2(規則))

NOT EXISTS —-不存在
DISTINCT —去重(完全一樣)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章