Sql server 唯一字段列表
我有一个包含以下数据的表Sql server 唯一字段列表,sql-server,tsql,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 我想将此表分组,以显示该表何时从临时变为每周,何时又从每周变为临时。我不想知道这张桌子是什么时候从一周换到另一周的。结束表应该是这样的 Startdat
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
您将如何做到这一点?双
分组操作可以找到以下数据:
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
(注意我已经根据评论调整了最后一行)
这是通过为每一行查找具有不同频率
值的最早行来实现的。这意味着,例如,一组相邻的Ad hoc
行将使用Weekly
值定位相同的后续行。这就是CTE/firstGROUP BY
正在做的事情
因此,如果我们随后获取所有这些行并找到其中最早的一行,我们就成功地隐藏了中间行的存在-这就是第二个GROUP BY
所做的。双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
(注意我已经根据评论调整了最后一行)
这是通过为每一行查找具有不同频率
值的最早行来实现的。这意味着,例如,一组相邻的Ad hoc
行将使用Weekly
值定位相同的后续行。这就是CTE/firstGROUP BY
正在做的事情
因此,如果我们随后获取所有这些行并找到其中最早的一行,我们已经成功地隐藏了中间行的存在-这就是第二个分组BY
所做的。您不打算在大约6个月内运行此查询吗?你真的希望最后一行的开始日期晚于结束日期吗?啊,我没看到。那个日期是个打字错误。我今天之后没有任何日期,所以它会改为2017-02-20。您不打算在大约6个月内运行此查询吗?你真的希望最后一行的开始日期晚于结束日期吗?啊,我没看到。那个日期是个打字错误。今天之后我没有任何约会,所以改为2017-02-20。这真是太棒了-非常感谢达米恩的不信者,谢谢你。我还有一个请求-如果你桌上有身份证号码,你会怎么做。比如,如果前三行的ID是30,后三行的ID是40?这太棒了-非常感谢达米恩,这位不信的人给了我这个美女。我还有一个请求-如果你在表中有一个ID号,你会怎么做。比如,如果前三行的ID为30,后三行的ID=40?