У меня есть ситуация, когда мне нужно найти промежутки времени между изменениями значений. Я попробовал простой элемент group by, но он устраняет перекрывающиеся изменения. Рассмотрим следующий пример:Как избежать перекрытия диапазонов дат при использовании предложения группировки?
create table #items (
code varchar(4)
, class varchar(4)
, txdate datetime
)
insert into #items (code, class, txdate) values ('A', 'C', '2010-01-01');
insert into #items (code, class, txdate) values ('A', 'C', '2010-01-02');
insert into #items (code, class, txdate) values ('A', 'C', '2010-01-03');
insert into #items (code, class, txdate) values ('A', 'D', '2010-01-04');
insert into #items (code, class, txdate) values ('A', 'D', '2010-01-05');
insert into #items (code, class, txdate) values ('A', 'C', '2010-01-06');
insert into #items (code, class, txdate) values ('A', 'C', '2010-01-07');
insert into #items (code, class, txdate) values ('A', 'D', '2010-01-08');
insert into #items (code, class, txdate) values ('A', 'D', '2010-01-09');
select code
, class
, min(txdate) mindate
, max(txdate) maxdate
from #items
group by code, class
Это возвращает следующие результаты (обратите внимание на перекрывающиеся диапазоны дат):
|code|class|mindate |maxdate |
----------------------------------
|A |C |2010-01-01|2010-01-07|
|A |D |2010-01-04|2010-01-09|
Я хотел бы иметь запрос возвращал следующее:
|code|class|mindate |maxdate |
----------------------------------
|A |C |2010-01-01|2010-01-03|
|A |D |2010-01-04|2010-01-05|
|A |C |2010-01-06|2010-01-07|
|A |D |2010-01-08|2010-01-09|
Любые идеи и предложения?
Ваши даты ввода всех содержат январь месяца, но некоторые из ваших результатов имеют апрель. Вы переносили месяцы и дни в свои результаты, когда их вводили? – CanSpice
@CanSpice: мои даты используют формат yyyy-mm-dd. Я поймал ошибку и исправил ее. Thx –
Хорошо, тогда ваш пример должен включать даты в апреле, потому что все, что вы вводите, это даты в январе, но ваш пример возвращает даты в апреле. – CanSpice