【发布时间】:2017-02-07 13:50:31
【问题描述】:
我有这样的表:
CREATE TABLE [dbo].[TestToDelete](
[id] [int] NULL,
[Email] [nvarchar](50) NULL,
[RawEmail] [nvarchar](50) NULL,
[Status] [tinyint] NULL,
[ValidationDate] [datetime] NULL
) ON [PRIMARY]
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (1, N'a@a.ru', N'aaa@a.ru', 11, CAST(N'2017-02-07 14:00:30.300' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (2, N'a@a.ru', N'aaa@a.ru', 11, CAST(N'2017-02-07 14:00:52.347' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (3, N'a@a.ru', N'aaa@a.ru', 11, CAST(N'2017-02-07 14:00:58.117' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (4, N'a@a.ru', N'aaa@a.ru', 22, CAST(N'2017-02-07 14:01:08.360' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (5, N'b@b.ru', N'bbb@b.ru', 11, CAST(N'2017-02-07 14:01:21.783' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (6, N'b@b.ru', N'bbb@b.ru', 11, CAST(N'2017-02-07 14:01:29.310' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (7, N'b@b.ru', N'bbb@b.ru', 22, CAST(N'2017-02-07 14:01:37.050' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (8, NULL, N'bbb@b.ru', 0, CAST(N'2017-02-07 14:02:10.643' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (9, NULL, N'aaa@a.ru', 0, CAST(N'2017-02-07 14:02:22.160' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (10, N'anew@a.ru', N'aaa@a.ru', 11, CAST(N'2017-02-07 15:30:01.637' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (11, N'anew@a.ru', N'aaa@a.ru', 11, CAST(N'2017-02-07 15:30:06.657' AS DateTime))
INSERT [dbo].[TestToDelete] ([id], [Email], [RawEmail], [Status], [ValidationDate]) VALUES (12, N'anew@a.ru', N'aaa@a.ru', 11, CAST(N'2017-02-07 15:30:12.160' AS DateTime))
我需要选择出现 3 次或更多次且日期较新的记录(Email、RawEmail 和 Status 字段)。在这张表中是
'anew@a.ru | aaa@a.ru | 11'
而不是
'a@a.ru | aaa@a.ru | 11'
因为anew@a.ru 的日期更近
执行此选择的查询:
select * from
(
select email, rawEmail, Status,
ROW_NUMBER() OVER(PARTITION BY rawEmail ORDER BY vdate DESC) num
from
(select max([ValidationDate]) vdate, email, rawEmail, Status
from TestToDelete where status in (11, 22)
group by rawEmail, email, status
having count(*) > 2
) tmp
)final where num = 1
是否有可能用更少的子查询(不是现在的 3 个)来做到这一点?
更新: 出现 3 个或更多的预期输出:
anew@a.ru | aaa@a.ru | 11
出现 2 个或更多的预期输出:
anew@a.ru | aaa@a.ru | 11
b@b.ru | bbb@b.ru | 11
【问题讨论】:
-
您的意思是 3 条或更多条具有最新日期时间的记录吗?
-
@vkp 3 个或更多相同的记录,其中一个具有最新的日期时间。
-
@vkp 如果一个元组的日期为 2010、2011、2016 并且第二个元组的日期为 1997、1998 和 2017 - 我需要第二个,因为 2017 年更新。
-
请显示您的预期输出,是一条记录还是总共 3 条记录
-
你已经尽可能接近了。您必须对组子集进行排名并选择排名最高的行。由于您不能在一个查询中同时执行这两项操作,因此您至少需要两个查询。
标签: sql sql-server group-by