独特字段列表

时间:2017-03-13 09:33:35

标签: sql-server tsql

我有一个包含以下数据的表

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

你将如何做到这一点?

1 个答案:

答案 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正在做的事情。