【发布时间】:2020-04-06 22:15:05
【问题描述】:
我在 LINQPad 中尝试过以下操作:
create table users
(
id int not null,
startdate datetime not null,
enddate datetime not null
)
go
insert into users(id, startdate, enddate) values(1, '01/01/2000', '01/02/2000')
insert into users(id, startdate, enddate) values(1, '01/03/2000', '01/04/2000')
insert into users(id, startdate, enddate) values(2, '01/01/2000', '01/02/2000')
insert into users(id, startdate, enddate) values(2, '01/03/2000', '01/04/2000')
insert into users(id, startdate, enddate) values(2, '01/05/2000', '01/06/2000')
insert into users(id, startdate, enddate) values(3, '01/01/2000', '01/02/2000')
insert into users(id, startdate, enddate) values(3, '01/03/2000', '01/04/2000')
insert into users(id, startdate, enddate) values(3, '01/06/2000', '01/07/2000')
insert into users(id, startdate, enddate) values(4, '01/01/2000', '01/02/2000')
go
select * from users
go
// This query gave the result seen in the image
select id, startdate, enddate, rownum = dense_rank() over(partition by id order by enddate) from users
我想编写一个只返回 ID 1 和 2(而不是 3 和 4)的查询,因为:
- ID 1 - 多于 1 行,其 rownum 2 的开始日期为 1 天 在其 rownum 1 的 enddate 之前
- ID 2 - 有超过 1 行并且 它的 rownum n + 1 的 startdate 比它的 rownum 的 enddate 早 1 天 n
- ID 3 - 虽然有超过 1 行,但其 rownum 3 的开始日期是 不是其 rownum 2 的结束日期提前 1 天(但 2 天)。因此,它是 不合格
- ID 4 - 不超过 1 行。因此,它不是 合格
请告诉我如何得到这个结果?
【问题讨论】:
-
那么您期望的结果是什么:只是满足条件的
ids 列表(这将是两条记录,其值为1和2),或者所有ids 满足条件的记录? -
只是 ID 列表,即两条记录 - 1 和 2
标签: sql sql-server group-by subquery window-functions