sql-server - SQL Server - 查询最近的日期范围

标签 sql-server tsql

如果我有这样的表结构:

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

有没有办法查询给定 ProductCodeDate 的日期范围(假设范围必须是连续的)?换句话说,对于此表,Foo 存在于 3 个日期范围:4/1-4/34/6-4/10;和 4/15-4/17,我正在查找给定日期的日期范围。

请注意,Foo 没有日期的 4/44/54/11 >、4/124/134/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 窗口函数来检查行是否引入了新范围。一旦您知道哪些行引入了新范围,您就可以计算头行的数量,以便为每个范围分配唯一的编号。

有了范围编号,您就可以通过 minmax 查找开始日期和结束日期。之后,这只是选择行的问题:

; 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'

Example at SQL Fiddle.

关于sql-server - SQL Server - 查询最近的日期范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10259157/

相关文章:

c# - 如果新约束验证失败,则 DacServices 回滚

sql-server - 有没有办法根据变量将 WHERE 子句中的比较设置为 IS NULL 或 IS NOT NULL

sql - 旋转 SQL 表

tsql - 在 SQL Server 2008R2 上打印当年的所有日期

sql-server - 使用 SQL Server Reporting Services 的优势?

sql - 我如何在我的 SQL Server Profiler 上关闭来自 "Report Server"的行?

.net - 使用不同算法的 UUID 冲突风险

c# - 如何以编程方式创建新的本地 SQL Server 实例?

sql - 大写字母测试 - T-Sql

mysql - 对数据进行分组的 SQL 查询