2017-10-05 56 views
1

我有一個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你是對的。我更新了這個問題。 –

回答

3

可以使用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。

相關問題