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

标签 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

并且插入了以下数据:

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')

注意:* 标记重复。

如何只选择“第一”、“第二”、“第三”和“第四”的唯一连续组合?例如,对于上面插入的数据,期望的输出是:

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

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

我在这里看到过类似的问题,但我已经能够制定一个使用分组依据的解决方案。

任何帮助将不胜感激

最佳答案

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

;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
    )

SQL Fiddle

编辑

;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

SQL Fiddle

关于sql - 在重复项中选择不同的连续行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30773101/

相关文章:

java从oracle插入语句中获取结果

sql - N-M 关系中的复合主键与否?

sql - 以逗号分隔的列的行列表,在其他列上分组

tsql - 添加外键约束会占用内存并导致分页

mysql - SQL - 选择不遵循正确格式的所有内容

mysql - 将SQLite请求中的strftime转换为MySQL

MySQL:LOAD DATA INFILE 产生不正确的表结果

sql - 如何在 SQL Profiler 中配置警报和终止长时间运行的查询

sql - 取回已删除的记录

sql - 事件的总持续时间、间隔中可能存在的间隙和重叠