sql服务器select第一次发生数据变化
sql server select the first occurrence of data change
我有一个 sql 服务器 2008 r2 数据库。
我有一个名为 hystrealdata
的 table,其中每 n 秒 存储了一台汽车机器的生产数据。因此,它的结构如下:
dataregvalue timestamp
--------------------------------------------------------------------------
0 1507190476
0 1507190577
0 1507190598
0 1507190628
1 1507190719
1 1507190750
1 1507190780
1 1507190811
1 1507190841
2 1507190861
2 1507190892
2 1507190922
2 1507190953
2 1507190983
5 1507190477
我需要 select 第一行中第一次出现的 dataregvalue
,然后是下一个 dataregvalue 与前一个之间的差异。在这个数据旁边,我想有第一个时间戳,其中 dataregvalue canges。 select 的一个例子是:
data_change timestamp
---------------------------
0 1507190476 <- first time in which the dataregvalue is 0
1 1507190719 <- first time in which the dataregvalue changes
1 1507190861 <- first time in which the dataregvalue changes
3 1507190477 <- first time in which the dataregvalue changes
如果这太难了,最好像这样在新列中提供有关 dataregvalues 之间差异的信息:
dataregvalue data_change timestamp
---------------------------------------------
0 0 1507190476
1 1 1507190719
2 1 1507190861
5 3 1507190477
如何做到这一点?
提前致谢!
您可以使用LAG解析函数读取分区中的先前值,例如:
Select
dataregvalue,
dataregvalue - LAG(dataregvalue,1) OVER (ORDER BY timestamp) as data_change,
timestamp
from MyTable
这将return 所有行的更改。发生变化的行的 data_change
值 >0。第一行将具有 NULL 值,因为没有前一行。
很遗憾,您不能在 WHERE 子句中引用 data_change
。您必须使用 CTE :
WITH changes as (
Select
dataregvalue,
dataregvalue - LAG(dataregvalue,1) OVER (ORDER BY timestamp) as data_change,
timestamp
from MyTable
)
select *
from changes
where
data_change >0 or
data_change is null
LAG
和相应的 LEAD
函数也可用于检测序列中的间隙和孤岛。每行都有一个比前一行大 1 的 ID。在差距中,差异将> 1。
我有一个 sql 服务器 2008 r2 数据库。
我有一个名为 hystrealdata
的 table,其中每 n 秒 存储了一台汽车机器的生产数据。因此,它的结构如下:
dataregvalue timestamp
--------------------------------------------------------------------------
0 1507190476
0 1507190577
0 1507190598
0 1507190628
1 1507190719
1 1507190750
1 1507190780
1 1507190811
1 1507190841
2 1507190861
2 1507190892
2 1507190922
2 1507190953
2 1507190983
5 1507190477
我需要 select 第一行中第一次出现的 dataregvalue
,然后是下一个 dataregvalue 与前一个之间的差异。在这个数据旁边,我想有第一个时间戳,其中 dataregvalue canges。 select 的一个例子是:
data_change timestamp
---------------------------
0 1507190476 <- first time in which the dataregvalue is 0
1 1507190719 <- first time in which the dataregvalue changes
1 1507190861 <- first time in which the dataregvalue changes
3 1507190477 <- first time in which the dataregvalue changes
如果这太难了,最好像这样在新列中提供有关 dataregvalues 之间差异的信息:
dataregvalue data_change timestamp
---------------------------------------------
0 0 1507190476
1 1 1507190719
2 1 1507190861
5 3 1507190477
如何做到这一点? 提前致谢!
您可以使用LAG解析函数读取分区中的先前值,例如:
Select
dataregvalue,
dataregvalue - LAG(dataregvalue,1) OVER (ORDER BY timestamp) as data_change,
timestamp
from MyTable
这将return 所有行的更改。发生变化的行的 data_change
值 >0。第一行将具有 NULL 值,因为没有前一行。
很遗憾,您不能在 WHERE 子句中引用 data_change
。您必须使用 CTE :
WITH changes as (
Select
dataregvalue,
dataregvalue - LAG(dataregvalue,1) OVER (ORDER BY timestamp) as data_change,
timestamp
from MyTable
)
select *
from changes
where
data_change >0 or
data_change is null
LAG
和相应的 LEAD
函数也可用于检测序列中的间隙和孤岛。每行都有一个比前一行大 1 的 ID。在差距中,差异将> 1。