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。