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

Sql 在重复项中选择不同的连续行,sql,sql-server,sql-server-2008-r2,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',

我有一张结构如下的表格:

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
我正在寻找一种解决方案,当条目不再连续(或序列中断)时保留条目,但删除连续条目的重复项

我在这里看到过类似的问题,但我可以使用分组方式来制定解决方案


任何帮助都将不胜感激

您可以根据第一、第二、第三、第四的值进行分组 然后选择这些值与最小值(日期)相遇的第一个日期,或与最大值(日期)相遇的最后一次日期

遇到的最后一个日期的示例:

编辑:编辑上一个查询以包括开始日期和结束日期

额外:等待您回复时我正在玩的东西:包括值出现在1字段中的日期列表:

SELECT first, second, third, fourth,
STUFF((
          SELECT ',' + convert(varchar(25),T.date)
          FROM roster T
          WHERE A.first = T.first
          AND A.second = T.second
          AND A.third = T.third
          AND A.fourth = T.fourth
          ORDER BY T.date
          FOR XML PATH('')), 1, 1, '') as dates

from roster A
GROUP BY first, second, third, fourth
编辑:我已经非常接近你想要的,但还不完全,但是我不知道如何更接近,我想这是我所能做到的,其余的取决于其他人:D:


您可以按第一、第二、第三、第四的值进行分组 然后选择这些值与最小值(日期)相遇的第一个日期,或与最大值(日期)相遇的最后一次日期

遇到的最后一个日期的示例:

编辑:编辑上一个查询以包括开始日期和结束日期

额外:等待您回复时我正在玩的东西:包括值出现在1字段中的日期列表:

SELECT first, second, third, fourth,
STUFF((
          SELECT ',' + convert(varchar(25),T.date)
          FROM roster T
          WHERE A.first = T.first
          AND A.second = T.second
          AND A.third = T.third
          AND A.fourth = T.fourth
          ORDER BY T.date
          FOR XML PATH('')), 1, 1, '') as dates

from roster A
GROUP BY first, second, third, fourth
编辑:我已经非常接近你想要的,但还不完全,但是我不知道如何更接近,我想这是我所能做到的,其余的取决于其他人:D:


如果只需要一个
存在()
,为什么需要一个
分组依据

编辑

;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

如果只需要一个
存在()
,为什么需要一个
分组依据

编辑

;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


因此,仅选择第一个e m a r组合,而不是位置4的组合?正确。也不是第6位的那个。好的,那么应该选择哪个日期呢?最高的还是最低的?或者中间的一个?理想情况下,我需要最低和最高的日期,这将标记开始和结束日期。好的,完成并添加一点额外的:Dso只选择第一个e m a r组合,而不是位置4的组合?正确。也不是第6位的那个。好的,那么应该选择哪个日期呢?最高的还是最低的?或者中间的日期?理想情况下,我需要最低和最高的日期,这将标记开始和结束日期。好的,完成并添加一点额外的:d感谢回复。不幸的是,您的答案将2015-06-10和2015-06-15两个条目分组。我希望两者都能保留下来,因为它们不是连续的。不幸的是,我正在寻找一种解决方案,当条目不再连续时保留条目,但删除连续条目的重复项。啊,我明白了,所以您需要2015-06-10和2015-06-14,然后是2015-06-15的新记录,抱歉,我误解了question@Luke我离得很近,但我不知道怎样才能做得更好,对不起,伙计,就我的能力而言,检查代码并在最后一个编辑下进行修改谢谢你的回复。不幸的是,您的答案将2015-06-10和2015-06-15两个条目分组。我希望两者都能保留下来,因为它们不是连续的。不幸的是,我正在寻找一种解决方案,当条目不再连续时保留条目,但删除连续条目的重复项。啊,我明白了,所以您需要2015-06-10和2015-06-14,然后是2015-06-15的新记录,抱歉,我误解了question@Luke我离得很近,但我不知道怎样才能做得更好,抱歉,老兄,就我的技能而言,检查代码并在最后一个编辑下进行处理,这太棒了!谢谢你的回复。您将如何在返回的行中包括结束日期和开始日期?@JeremyC。只是注意到评论,问题输出没有更新。不管怎样,我不确定这是否正是他所需要的,但在我看来很好。完美答案非常好的“数字部分”技巧,可以找到连续的重复项。太棒了!谢谢你的回复。您将如何在返回的行中包括结束日期和开始日期?@JeremyC。只是注意到评论,问题输出没有更新。不管怎样,我不确定这是否正是他所需要的,但在我看来很好。完美答案非常好的“数字部分”技巧,可以找到连续的重复项。
;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