Sql server 仅基于一个字段,选择与以前记录相比发生更改的记录

Sql server 仅基于一个字段,选择与以前记录相比发生更改的记录,sql-server,Sql Server,考虑以下示例数据 | SN | DateTime | Status | |----|-----------------------|--------| | 1 | '2015-01-01 00:30:00' | OPEN | | 2 | '2015-01-01 00:35:00' | OPEN | | 3 | '2015-01-01 00:40:00' | CLOSED | | 4 | '2015-01-01 00:50:00' | OPEN | |

考虑以下示例数据

| SN |        DateTime       | Status |
|----|-----------------------|--------|
|  1 | '2015-01-01 00:30:00' | OPEN   |
|  2 | '2015-01-01 00:35:00' | OPEN   |
|  3 | '2015-01-01 00:40:00' | CLOSED |
|  4 | '2015-01-01 00:50:00' | OPEN   |
|  5 | '2015-01-01 01:10:00' | OPEN   |
|  6 | '2015-01-01 01:15:00' | CLOSED |
|  7 | '2015-01-01 01:20:00' | CLOSED |
|  8 | '2015-01-01 01:30:00' | OPEN   |
|  9 | '2015-01-01 01:40:00' | OPEN   |
| 10 | '2015-01-01 01:52:00' | OPEN   |
| 11 | '2015-01-01 01:55:00' | CLOSED |
| 12 | '2015-01-01 02:15:00' | OPEN   |
| 13 | '2015-01-01 02:30:00' | OPEN   |
我需要选择列“Status”的值与以前的记录不同的记录。应始终返回第一条记录

我可以使用SQL Server中的For循环来完成,但我想要一个更好的解决方案。是否可以在单个SELECT语句中执行此操作?查询应返回序列为1、3、4、6、8、11和12的行。

您可以使用LAG获取以前的状态值,然后在外部查询的WHERE子句中使用此值以获取所需的:

SELECT SN, [DateTime], Status 
FROM (
   SELECT SN, [DateTime], Status, 
          LAG(Status) OVER (ORDER BY [DateTime]) AS prevStatus
   FROM mytable ) t
WHERE COALESCE(prevStatus, '') <> Status

或者在没有延迟的情况下,您可以使用此查询

select * from (SELECT TOP 1 SN, [DateTime], Status from mytable  order by SN) as s
UNION ALL
SELECT T.SN, t.[DateTime], t.Status 
FROM mytable t
    inner join mytable t2
    on t.SN=t2.SN+1 AND t.status <> t2.status

我们可以使用Union运算符,然后在Id+1上自联接表

select * from Delta where id = 1 
UNION 
select  D.*from 
Delta D JOIN Delta DL On D.Id  = Dl.Id +1  
AND
D.Status <> DL.Status

什么版本的sql server?2012 Express@wewewesthemenacei我想知道sql server中是否有LAG2008@PareshJ从SQL Server 2012开始提供。