Как группировать по диапазону дат, начиная с начальной даты - PullRequest
2 голосов
/ 17 ноября 2011

У меня есть следующая структура таблицы

Key int
MemberID int
VisitDate DateTime

Как можно сгруппировать все даты, попадающие в заданный диапазон дат, скажем, 15 дней.1004 *

например

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 Ответ

3 голосов
/ 17 ноября 2011

Один из способов сделать это - использовать агрегирование окон .Вот как это делается:

  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
    

По сути, для каждой строки запрос вычисляет разницу дней между VisitDate и первым VisitDate для того же ID и делит ее на15. Результат затем используется в качестве критерия группировки.Обратите внимание, что SQL Server использует целочисленное деление, когда оба операнда оператора / являются целыми числами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...