我有一个包含以下数据的表
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
我想将此表分组,以显示该表何时从Ad-Hoc转到Weekly,再从Weekly转到Ad-hoc。我不想知道桌子从每周一次到每周一次。结束表应如下所示。
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 :(得分: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 /第一GROUP BY
正在做的事情。
所以,如果我们接下来所有这些行并找到最早的行,我们就成功地隐藏了中间行的存在 - 这是第二个GROUP BY
正在做的事情。