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/first
GROUP 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/first
GROUP BY
正在做的事情


因此,如果我们随后获取所有这些行并找到其中最早的一行,我们已经成功地隐藏了中间行的存在-这就是第二个
分组BY
所做的。

您不打算在大约6个月内运行此查询吗?你真的希望最后一行的开始日期晚于结束日期吗?啊,我没看到。那个日期是个打字错误。我今天之后没有任何日期,所以它会改为2017-02-20。您不打算在大约6个月内运行此查询吗?你真的希望最后一行的开始日期晚于结束日期吗?啊,我没看到。那个日期是个打字错误。今天之后我没有任何约会,所以改为2017-02-20。这真是太棒了-非常感谢达米恩的不信者,谢谢你。我还有一个请求-如果你桌上有身份证号码,你会怎么做。比如,如果前三行的ID是30,后三行的ID是40?这太棒了-非常感谢达米恩,这位不信的人给了我这个美女。我还有一个请求-如果你在表中有一个ID号,你会怎么做。比如,如果前三行的ID为30,后三行的ID=40?