一覧

2017-03-13 6 views
1

私はグループこのテーブルをテーブルが再び週刊にし、毎週からアドホックにアドホックから行ったときに表示するためにしたいと思い、次のデータ一覧

Modifieddate, Frequency 

2015-01-15 Ad-hoc 
2015-01-19 Weekly 
2015-01-20 Weekly 
2016-09-23 Ad-hoc 
2016-09-25 Ad-hoc 
2017-09-20 Monthly 

を含むテーブルを持っています。私は、テーブルが毎週から毎週になったときを知りたくありません。エンドテーブルはこのようになります。

Startdate, Enddate, Frequency 

2015-01-15 2015-01-19 Ad-hoc 
2015-01-19 2016-09-23 Weekly 
2016-09-23 2017-09-20 Ad-hoc 
2017-09-20 getdate() Monthly 

あなたはどのようにしますか?

+0

このクエリを約6か月間実行するつもりはありませんか?その最後の行のEndDateより後のStartDateで実際に結果が必要ですか? –

+0

ああ - 私はそれを見ませんでした。その日付はタイプミスです。私は今日の後に日付がないので、代わりに2017-02-20と言うでしょう。 –

答えて

0

ダブル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の行が介在する行の存在を隠すことに成功しました。

+0

これはちょうど素晴らしいです - この美人のDamien_The_Unbelieverに本当に感謝します。 –

+0

もう1つのリクエストがあります。テーブルにID番号があればどうしますか?同様に、最初の3つの行のIDが30で、最後の3つの行のIDが40の場合は? –