2013-05-22 5 views
1

У меня есть таблица с ID и поле ДатаTSQL - Получить данные, сгруппированные по номеру строки

ID  |Date 
1  |2013-5-22 
1  |2013-5-23 
1  |2013-5-25 
1  |2013-5-26 
2  |2013-5-26 
2  |2013-5-27 
1  |2013-5-27 
1  |2013-5-28 

С row_number я могу сгруппировать все данные по идентификатору и ghet дату Min и Max Дата

;WITH q AS(
SELECT f.*, 
grp = DATEDIFF(day, 0, f.Date) - ROW_NUMBER() OVER (PARTITION BY f.ID ORDER BY f.Date), 
FROM myTable f  
) 
SELECT 
MIN(q.ID) as ID, 
MIN(q.Date) as StartDate, 
MAX(q.Date) as EndDate 
FROM q 
GROUP BY q.grp, q.ID, Date 
; 

Результат:

ID  |StartDate |EndDate 
1  |2013-5-22 |2013-5-23 
2  |2013-5-26 |2013-5-27 
1  |2013-5-25 |2013-5-28 

Теперь мне нужно, чтобы получить шаг даты по < = 3 Пример:

ID  |StartDate |EndDate 
1  |2013-5-22 |2013-5-23 
2  |2013-5-26 |2013-5-27 
1  |2013-5-25 |2013-5-27 
1  |2013-5-28 |2013-5-28 

Может кто-нибудь, пожалуйста, осветить мой путь? ти

EDIT К сожалению

;WITH q AS(
SELECT f.*, 
grp = DATEDIFF(day, 0, f.Date) - ROW_NUMBER() OVER (PARTITION BY f.ID ORDER BY f.Date) 
FROM MyTable f 
) 
SELECT 
MIN(q.ID) as ID, 
MIN(q.Date) as StartDate, 
MAX(q.Date) as EndDate 
FROM q 
GROUP BY q.grp, q.ID 
; 
+1

Ваш запрос не работает из-за запятой за колонки row_number. Но даже тогда он возвращает другой результат. http://sqlfiddle.com/#!6/8d8e2/4/0 –

ответ

0

Моя первая попытка была ошибка, попробуйте вместо этого:

;WITH q AS(
    SELECT ID, Date, 
    grp = DATEDIFF(day, 0, Date) - ROW_NUMBER() OVER (PARTITION BY ID ORDER BY Date) 
FROM myTable 
), r as 
(
    select id, date, grp, 
    (ROW_NUMBER() OVER (PARTITION BY grp ORDER BY Date)-1)/3 a from q 
) 
SELECT 
MIN(ID) as ID, 
MIN(Date) as StartDate, 
MAX(Date) as EndDate 
FROM r 
GROUP BY grp, ID, a 
Смежные вопросы