如何按日期范围从初始日期开始分组

时间:2011-11-17 09:50:18

标签: sql sql-server sql-server-2008

我有以下表结构

Key int
MemberID int
VisitDate DateTime

如何将所有日期范围内的日期分组为15天..同一成员的第一次访问应被视为开始日期。

例如

Key     ID     VisitDate(MM/dd/YY)
1        1      02/01/11
2        1      02/09/11
3        1      02/12/11
4        1      02/17/11
5        2      02/03/11
6        2      02/19/11

在这种情况下,结果应为

ID   StartDate      EndDate    
1    02/01/11       02/12/11    
1    02/17/11       02/17/11     
2    02/03/11       02/03/11     
2    02/19/11       02/19/11     

1 个答案:

答案 0 :(得分:3)

执行此操作的一种方法是使用window aggregating。方法如下:

  1. 设定:

    DECLARE @data TABLE (
      [Key] int, ID int, VisitDate date
    );
    
    INSERT INTO @data ([Key], ID, VisitDate)
    SELECT 1, 1, '02/01/2011' UNION ALL
    SELECT 2, 1, '02/09/2011' UNION ALL
    SELECT 3, 1, '02/12/2011' UNION ALL
    SELECT 4, 1, '02/17/2011' UNION ALL
    SELECT 5, 2, '02/03/2011' UNION ALL
    SELECT 6, 2, '02/19/2011';
    
  2. 查询:

    WITH marked AS (
      SELECT
        *,
        Grp = DATEDIFF(DAY, MIN(VisitDate) OVER (PARTITION BY ID), VisitDate) / 15
      FROM @data
    )
    SELECT
      ID,
      StartDate = MIN(VisitDate),
      EndDate   = MAX(VisitDate)
    FROM marked
    GROUP BY ID, Grp
    ORDER BY ID, StartDate
    
  3. 输出:

    ID          StartDate  EndDate
    ----------- ---------- ----------
    1           2011-02-01 2011-02-12
    1           2011-02-17 2011-02-17
    2           2011-02-03 2011-02-03
    2           2011-02-19 2011-02-19
    
  4. 基本上,对于每一行,查询都会计算VisitDate与同一VisitDate的第一个ID之间的天数差异,并将其除以15.然后使用结果作为分组标准。请注意,当/运算符的两个操作数都是整数时,SQL Server使用整数除法。