我有一个包含这样的数据的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'
答案 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