在重复项中选择不同的连续行

Luk*_*uke 1 sql sql-server sql-server-2008-r2

我有一个具有以下结构的表:

create table roster
(
date date not null,
first nvarchar(20) not null,
second nvarchar(20) not null,
third nvarchar(20) not null,
fourth nvarchar(20) not null,
)
go
Run Code Online (Sandbox Code Playgroud)

并且插入了以下数据:

insert into roster values ('2015-06-10 12:45:34', 'e', 'm', 'a', 'r')
insert into roster values ('2015-06-11 12:45:34', 'e', 'v', 'a', 'r')
insert into roster values ('2015-06-12 12:45:34', 'e', 'm', 'a', 'd') 
insert into roster values ('2015-06-13 12:45:34', 'e', 'm', 'a', 'd') *
insert into roster values ('2015-06-14 12:45:34', 'e', 'm', 'a', 'r')
insert into roster values ('2015-06-15 12:45:34', 'e', 'm', 'a', 'r') *
insert into roster values ('2015-06-16 12:45:34', 'z', 'm', 't', 'r')
Run Code Online (Sandbox Code Playgroud)

注意:*标记重复项。

如何仅选择“第一”,“第二”,“第三”和“第四”的一个唯一连续组合?例如,使用上面插入的数据,所需的输出是:

Date                 First Second Third Fourth
2015-06-10 12:45:34, e     m      a     r
2015-06-11 12:45:34, e     v      a     r
2015-06-12 12:45:34, e     m      a     d
2015-06-14 12:45:34, e     m      a     r
2015-06-16 12:45:34, z     m      t     r
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种解决方案,当它们不再连续时(或序列中断时)保留条目,但删除连续条目的重复项。

我在这里看到过类似的问题,但是我已经能够提出使用group by的解决方案。

任何帮助,将不胜感激

Eri*_*ric 5

group by如果只需要一个,为什么还要一个exists()

;with data as
(
    select ROW_NUMBER() OVER (ORDER BY date) AS number, * from roster
)
select * from data where 
    not exists -- Just compare with the previous column, if match say bye
    (
        select * from data prev where 1 = 1
            and prev.first = data.first 
            and prev.second = data.second 
            and prev.third = data.third 
            and prev.fourth = data.fourth 
            and prev.number + 1 = data.number
    )
Run Code Online (Sandbox Code Playgroud)

SQL小提琴

编辑

;with data as
(
    select
        ROW_NUMBER() OVER (ORDER BY date) AS number, 
        ROW_NUMBER() OVER (PARTITION BY first, second, third, fourth ORDER BY date) AS part,
        *
    from roster
)
select MIN(date) as startdate, MAX(date) as enddate, COUNT(*) count, first, second, third, fourth
from data group by first, second, third, fourth, number - part
order by number - part
Run Code Online (Sandbox Code Playgroud)

SQL小提琴