假定一個表裏有各種各樣的花式重複數據、
在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 —去重(完全一樣)