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 —去重(完全一样)

猜你喜欢

转载自blog.csdn.net/zhangyongze_z/article/details/81708037