Select 日期时间和值,当值 != LAG(值)

Select datetime and value, when value != LAG(value)

我正在研究 SQL Server 2014。

我有这样的数据:

datetime                      Value
2020-11-27 11:20:20.0000000   0
2020-11-27 11:21:20.0000000   0
2020-11-27 11:22:20.0000000   1
2020-11-27 11:23:20.0000000   1
2020-11-27 11:24:20.0000000   2
2020-11-27 11:25:20.0000000   2
2020-11-27 11:26:20.0000000   2
2020-11-27 11:27:20.0000000   1
2020-11-27 11:28:20.0000000   1
2020-11-27 11:29:20.0000000   1
2020-11-27 11:30:20.0000000   2
2020-11-27 11:31:20.0000000   null
2020-11-27 11:32:20.0000000   2

我需要:

datetime                      Value
2020-11-27 11:20:20.0000000   0
2020-11-27 11:22:20.0000000   1
2020-11-27 11:24:20.0000000   2
2020-11-27 11:27:20.0000000   1
2020-11-27 11:30:20.0000000   2
2020-11-27 11:31:20.0000000   null
2020-11-27 11:32:20.0000000   2

我可以有十万行,所以我也需要一些高效的东西。我尝试使用 LAG()rank()first(),但我从未得到预期的结果。

只需使用LAG():

SELECT [datetime], [value]
FROM (
   SELECT 
      [datetime], [value],
      LAG([value]) OVER (ORDER BY [datetime] ASC) AS [prevvalue]
   FROM (VALUES
      ('2020-11-27T11:20:20.0000000', 0),
      ('2020-11-27T11:21:20.0000000', 0),
      ('2020-11-27T11:22:20.0000000', 1),
      ('2020-11-27T11:23:20.0000000', 1),
      ('2020-11-27T11:24:20.0000000', 2),
      ('2020-11-27T11:25:20.0000000', 2),
      ('2020-11-27T11:26:20.0000000', 2),
      ('2020-11-27T11:27:20.0000000', 1),
      ('2020-11-27T11:28:20.0000000', 1),
      ('2020-11-27T11:29:20.0000000', 1),
      ('2020-11-27T11:30:20.0000000', 2),
      ('2020-11-27T11:31:20.0000000', null),
      ('2020-11-27T11:32:20.0000000', 2)
   ) v ([datetime], [value])   
) t
WHERE COALESCE([value], -1) <> COALESCE([prevvalue], -1)

结果:

datetime                    value
2020-11-27T11:20:20.0000000 0
2020-11-27T11:22:20.0000000 1
2020-11-27T11:24:20.0000000 2
2020-11-27T11:27:20.0000000 1
2020-11-27T11:30:20.0000000 2
2020-11-27T11:31:20.0000000 null
2020-11-27T11:32:20.0000000 2