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的解决方案。
任何帮助,将不胜感激
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)
编辑
;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)