ダブルGROUP BY
操作は、このデータを見つけることができます。
declare @t table (ModifiedDate date,Frequency varchar(19))
insert into @t(ModifiedDate, Frequency) values
('20150115','Ad-hoc'),
('20150119','Weekly'),
('20150120','Weekly'),
('20160923','Ad-hoc'),
('20160925','Ad-hoc'),
('20170220','Monthly')
;With Ends as (
select t1.ModifiedDate as StartAt,MIN(t2.ModifiedDate) as EndAt,t1.Frequency
from
@t t1
inner join
(select * from @t union all select GETDATE(),'dfdhfhdsfjfh') t2
on
t1.Frequency != t2.Frequency and
t1.ModifiedDate < t2.ModifiedDate
group by
t1.ModifiedDate,t1.Frequency
)
select MIN(StartAt) as StartAt,EndAt,Frequency from Ends
group by EndAt,Frequency
order by StartAt
結果:
StartAt EndAt Frequency
---------- ----------------------- -------------------
2015-01-15 2015-01-19 00:00:00.000 Ad-hoc
2015-01-19 2016-09-23 00:00:00.000 Weekly
2016-09-23 2017-02-20 00:00:00.000 Ad-hoc
2017-02-20 2017-03-13 11:54:39.277 Monthly
(私はコメントに基づいて最後の行を微調整してきたことに注目します)。
の場合、すべての行の最初の行には、Frequency
という値があります。つまり、隣り合うAd-hoc
の行のグループは、Weekly
の値を持つと同じの後続の行を見つけることになります。それがCTE/first GROUP BY
がやっていることです。
このように、すべての行を取り出して最も早い行を見つけたら、2番目のGROUP BY
の行が介在する行の存在を隠すことに成功しました。
このクエリを約6か月間実行するつもりはありませんか?その最後の行のEndDateより後のStartDateで実際に結果が必要ですか? –
ああ - 私はそれを見ませんでした。その日付はタイプミスです。私は今日の後に日付がないので、代わりに2017-02-20と言うでしょう。 –