【发布时间】:2026-01-18 00:20:04
【问题描述】:
我需要找到定义为范围的开始和结束日期:开始日期是第一个日期,结束日期是第一个日期,后续日期是结束日期后两个月或更长时间。可以有多个可能的范围
我有一个类似的表结构:
ID int identity(1,1),
fk_ID char(9),
dateField datetime
数据如下:
1 a 2012-01-01
2 a 2012-01-05
3 a 2012-01-12
4 b 2012-02-01
5 a 2012-04-01
6 b 2012-05-01
7 a 2012-05-30
预期的输出如下所示:
fk_id startdate enddate
a 2012-01-01 2012-01-12
a 2012-04-01 2012-05-30
b 2012-02-01 2012-02-01
b 2012-05-01 null
编辑: 通过执行以下操作:
CREATE TABLE #temp
(
autonum int identity(1,1),
id char(9),
sd datetime
)
insert into #temp (id, sd) values ('a', '2012-01-01')
insert into #temp (id, sd) values ('a', '2012-01-05')
insert into #temp (id, sd) values ('a', '2012-01-12')
insert into #temp (id, sd) values ('a', '2012-03-01')
insert into #temp (id, sd) values ('a', '2012-04-03')
insert into #temp (id, sd) values ('a', '2012-06-06')
insert into #temp (id, sd) values ('b', '2012-02-12')
insert into #temp (id, sd) values ('b', '2012-02-15')
insert into #temp (id, sd) values ('b', '2012-03-01')
insert into #temp (id, sd) values ('b', '2012-04-03')
insert into #temp (id, sd) values ('b', '2012-06-01')
select t1.id, null as previousend, min(t1.sd) as nextstart
from #temp t1
group by t1.id
union
select t1.id, t1.sd as enddate, (select min(t2.sd) from #temp t2 where t1.id=t2.id and t2.sd>t1.sd) as nextstart
from #temp t1
where (select min(t2.sd) from #temp t2 where t1.id=t2.id and t2.sd>t1.sd) >= dateadd(month, 2, t1.sd)
union
select t1.id, max(t1.sd), null
from #temp t1
group by t1.id
drop table #temp
我可以得到这样的输出:
id previousend nextstart
--------- ----------------------- -----------------------
a NULL 2012-01-01 00:00:00.000
a 2012-04-03 00:00:00.000 2012-06-06 00:00:00.000
a 2012-06-06 00:00:00.000 NULL
b NULL 2012-02-12 00:00:00.000
b 2012-06-01 00:00:00.000 NULL
这非常接近,但理想情况下,该范围的开始日期和结束日期将在行上。
【问题讨论】:
-
我想你的意思是...结束日期是第一个日期,随后的日期在开始日期之后两个月或更长时间对吧?
-
@alfonso 不幸的是,描述是准确的,虽然有点令人困惑。数据示例有望阐明情况。
-
您已经在第二组不同的样本数据中展示了“非常接近”的内容。在这种情况下,你能否展示你真正想要的结果,而不是用另一个令人困惑的单词问题模糊地描述它?
-
在您的第一个示例中,您似乎让 b 的 enddate 为空,因为该 ID 在第二个范围内只有一个日期。但是在第二个示例中,您没有显示您想要的实际结果,但是从您现在得到的外观来看,您似乎不希望 a 的最后一个范围的结束日期为 null,它只有只有日期。这变得越来越令人困惑,并且很难通过单个查询来解决这两个示例。能否请您提交一个新问题,其中包含一个单一的、有凝聚力的问题陈述和一组样本数据和期望的结果?
-
您的样本数据应该涵盖所有边缘情况,这样人们就不会浪费时间来制定有效的解决方案,直到您在其中添加额外的一行...
标签: sql tsql sql-server-2005