sql server选择第一次出现数据更改

问题描述:

我有一个sql server 2008 r2数据库。sql server选择第一次出现数据更改

我有一张名为hystrealdata的表格,其中每存储自动机器的生产数据。因此,它的结构是这样的:

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  

我需要在第一行中选择一个dataregvalue的第一次出现,那么接下来dataregvalue和以前的区别之一。在这个数据旁边,我希望有第一个时间戳dataregvalue。选择的一个例子是:

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 

哪有这样做? 在此先感谢!

+0

请问您可以查看您的示例吗? data_change 3来自哪里?为什么在示例1中1列出了两次,5次未列出?此外,我们是在谈论一个真正的时间戳还是由交付系统创建的东西?换句话说:我们可以用它来计算吗? – Tyron78

+1

对于数据值5,您确定您期望时间戳1507190861?根据你的数据,第一次从2变到5时,是1507190477。 –

+0

Tyron78,data_changes是该时间戳处的dataregvalue与其之前的差异。因此,如果在时间戳= 1507190983时dataregvalue为2,则时间戳1507190477的下一个为5,5和2之间的差为3.这就是为什么会出现3。 Rigerta Demiri你是对的。我更新了这个问题。 –

可以使用LAG分析功能分区看完前面的值,例如:

Select 
    dataregvalue, 
    dataregvalue - LAG(dataregvalue,1) OVER (ORDER BY timestamp) as data_change, 
    timestamp 
from MyTable 

这将返回的所有行的变化。有变化的行将有一个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和corresponing LEAD功能,可用于检测漏洞和岛屿的顺序为好。每一行都会有一个比前一个更大的ID。在差距中,差异将大于1。