У меня есть следующие структуры таблицы:Определения смежных интервалов дат
id int -- more like a group id, not unique in the table
AddedOn datetime -- when the record was added
Для конкретного id
есть самого один рекорд каждый день. Я должен написать запрос, который возвращает смежные (на уровне дня) интервалы даты для каждого id
. Ожидаемый результат структура:
id int
StartDate datetime
EndDate datetime
Обратите внимание, что время часть AddedOn
доступна, но это не важно.
Чтобы было понятнее, вот некоторые входные данные:
with data as
(
select * from
(
values
(0, getdate()), --dummy record used to infer column types
(1, '20150101'),
(1, '20150102'),
(1, '20150104'),
(1, '20150105'),
(1, '20150106'),
(2, '20150101'),
(2, '20150102'),
(2, '20150103'),
(2, '20150104'),
(2, '20150106'),
(2, '20150107'),
(3, '20150101'),
(3, '20150103'),
(3, '20150105'),
(3, '20150106'),
(3, '20150108'),
(3, '20150109'),
(3, '20150110')
) as d(id, AddedOn)
where id > 0 -- exclude dummy record
)
select * from data
И ожидаемый результат:
id StartDate EndDate
1 2015-01-01 2015-01-02
1 2015-01-04 2015-01-06
2 2015-01-01 2015-01-04
2 2015-01-06 2015-01-07
3 2015-01-01 2015-01-01
3 2015-01-03 2015-01-03
3 2015-01-05 2015-01-06
3 2015-01-08 2015-01-10
Хотя это выглядит как обычная проблема, которую я не мог найти достаточно подобный вопрос , Также я приближаюсь к решению, и я опубликую его, когда (и если) это сработает, но я чувствую, что должен быть более элегантный.
Пробелы и островов: https://www.simple-talk.com/sql/t-sql-programming/the-sql-of-gaps и-острова-в-последовательности/https://technet.microsoft.com/en-us/library/aa175780%28v=sql.80%29.aspx http://blogs.msdn.com/b/samlester/ архив/2012/09/04/tsql-solve-it-your-way-gaps-and-island-with-a-twist.aspx В SQL Server 2012 я бы использовал 'LAG' или' LEAD', но в 2008 году было бы самосоединение. –