在重复

时间:2016-05-07 16:28:34

标签: sql sql-server tsql

我有一个包含这样的数据的SQL表,按日期排序:

+----------+------+
|   Date   | Col2 |
+----------+------+
| 12:00:01 | a    |
| 12:00:02 | a    |
| 12:00:03 | b    |
| 12:00:04 | b    |
| 12:00:05 | c    |
| 12:00:06 | c    |
| 12:00:07 | a    |
| 12:00:08 | a    |
+----------+------+

所以,我希望我的选择结果如下:

+----------+------+
|   Date   | Col2 |
+----------+------+
| 12:00:01 | a    |
| 12:00:03 | b    |
| 12:00:05 | c    |
| 12:00:07 | a    |
+----------+------+

我使用了distinct子句,但它删除了最后两行Col2 = 'a'

3 个答案:

答案 0 :(得分:2)

您可以使用lag(SQL Server 2012+)获取上一行中的值,然后将其与当前行值进行比较。如果它们相等,则将它们分配给一个组(此处为1)和另一组(0此处)。最后选择所需的行。

select dt,col2 
from (
select dt,col2,
case when lag(col2,1,0) over(order by dt) = col2 then 1 else 0 end as somecol
from t) x 
where somecol=0

答案 1 :(得分:0)

如果您使用的是Microsoft SQL Server 2012或更高版本,则可以执行以下操作:

select  date, col2
from    (
            select  date, col2,
                    case when isnull(lag(col2) over (order by date, col2), '') = col2 then 1 else 0 end as ignore
            from    (yourtable)
        ) x
where   ignore = 0

只要col2不能包含空值并且空字符串('')不是col2的有效值,这应该可以工作。如果任一假设无效,则查询将需要一些工作。

答案 2 :(得分:0)

与接受的答案(+1)相同,只是移动条件
假设col2不为空

select dt, col2 
from ( select dt, col2 
       lag(col2, 1) over(order by dt) as lagCol2 
       from t
     ) x 
where x.lagCol2 is null or x.lagCol2 <> x.col2