如果我有这样的表结构:
ProductCode Date
Foo 4/1/2012
Foo 4/2/2012
Foo 4/3/2012
Foo 4/6/2012
Foo 4/7/2012
Foo 4/8/2012
Foo 4/9/2012
Foo 4/10/2012
Foo 4/15/2012
Foo 4/16/2012
Foo 4/17/2012
有没有办法查询给定 ProductCode
和 Date
的日期范围(假设范围必须是连续的)?换句话说,对于此表,Foo 存在于 3 个日期范围:4/1-4/3
; 4/6-4/10
;和 4/15-4/17
,我正在查找给定日期的日期范围。
请注意,Foo
没有日期的 4/4
、4/5
、4/11
>、4/12
、4/13
和 4/14
。
示例:
ProductCode=Foo, Date=4/2
将返回 4/1-4/3
,因为条目是连续的。
ProductCode=Foo, Date=4/4
不会返回任何内容
ProductCode=Foo, Date=4/7
将返回 4/6-4/10
,因为条目是连续的。
ProductCode=Foo, Date=4/12
不会返回任何内容
等等
最佳答案
当前一天没有行时,新范围开始。如果您运行的是 SQL Server 2012,则可以使用lag
窗口函数来检查行是否引入了新范围。一旦您知道哪些行引入了新范围,您就可以计算头行的数量,以便为每个范围分配唯一的编号。
有了范围编号,您就可以通过 min
和 max
查找开始日期和结束日期。之后,这只是选择行的问题:
; with IsHead as
(
select ProductCode
, Date
, case when lag(Date) over (partition by ProductCode
order by Date) = dateadd(day, -1, Date) then 0
else 1 end as IsHead
from YourTable
)
, RangeNumber as
(
select ProductCode
, Date
, sum(IsHead) over (partition by ProductCode order by Date)
as RangeNr
from IsHead
)
, Ranges as
(
select *
, min(Date) over (partition by RangeNr) as RangeStart
, max(Date) over (partition by RangeNr) as RangeEnd
from RangeNumber
)
select *
from Ranges
where ProductCode = 'Bar'
and Date = '4/2/2012'
关于sql-server - SQL Server - 查询最近的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10259157/