Агрегирование дат в SQL Server - PullRequest
2 голосов
/ 03 июня 2011

У меня есть таблица из 2 столбцов с именем Assignment. Таблица содержит назначение Person (nvarchar(20)) и Day (date), как здесь:

Person      Day
------------------
John    2011-05-23
John    2011-05-24
John    2011-05-25
John    2011-05-27
John    2011-05-28
John    2011-05-29
Anna    2011-05-02
Anna    2011-05-03
Anna    2011-05-06

Мне нужно извлечь диапазоны дат, когда есть последовательность смежных дней. Выходными данными должно быть одно строковое значение для каждой строки:

------------------
John    2011-05-23 - 2011-05-25
John    2011-05-27 - 2011-05-29
Anna    2011-05-02 - 2011-05-03
Anna    2011-05-06 - 2011-05-06

Я пробовал группировать, а затем

   CAST(min(Day) AS VARCHAR) + ' - ' + CAST(max(Day) AS VARCHAR)

но это не работает правильно.

Любой совет приветствуется. Спасибо.

1 Ответ

3 голосов
/ 03 июня 2011
declare @T table(Person nvarchar(20), [Day] date)

insert into @T values
('John',    '2011-05-23'),
('John',    '2011-05-24'),
('John',    '2011-05-25'),
('John',    '2011-05-27'),
('John',    '2011-05-28'),
('John',    '2011-05-29'),
('Anna',    '2011-05-02'),
('Anna',    '2011-05-03'),
('Anna',    '2011-05-06')


;WITH cte AS
(
SELECT *,
        DATEDIFF(DAY,0,[Day])-
        ROW_NUMBER() OVER (PARTITION BY Person ORDER BY [Day]) AS Grp
FROM @T  
)
SELECT Person, 
       MIN([Day]) AS DateFrom, 
       MAX([Day]) AS DateTo  
FROM cte 
GROUP BY Person, Grp
...