2017-10-05 6 views
1

J'ai une base de données sql server 2008 r2.serveur sql sélectionnez la première occurrence de changement de données

J'ai une table appelée hystrealdata dans laquelle sont stockées les données de production d'une machine automotiv tous les n secondes. Ainsi, il est structuré comme celui-ci:

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  

je dois sélectionner la première occurrence d'un dataregvalue dans la première rangée, la différence entre la prochaine dataregvalue et le précédent. A côté de ces données je voudrais avoir le premier horodatage dans lequel dataregvalue canges. Un exemple de sélection serait:

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 

Si cela est trop difficile, il serait bien d'avoir des informations sur la différence entre dataregvalues ​​dans une nouvelle colonne comme ceci:

dataregvalue  data_change  timestamp    
--------------------------------------------- 
    0    0    1507190476 
    1    1    1507190719 
    2    1    1507190861 
    5    3    1507190477 

Comment cela doit être fait? Merci d'avance!

+0

Pourriez-vous s'il vous plaît examiner vos exemples? D'où vient le data_change 3? Pourquoi 1 est listé deux fois et 5 ne figure pas du tout dans l'exemple 1? En outre, parlons-nous d'un vrai timestamp ou est-ce quelque chose créé par le système de livraison? En d'autres termes: pouvons-nous calculer avec elle? – Tyron78

+1

Pour la valeur de données 5, êtes-vous certain de prévoir l'horodatage 1507190861? La première fois qu'il passe de 2 à 5, c'est 1507190477 selon vos données. –

+0

Tyron78, les changements de données sont la différence entre le dataregvalue à cet horodatage et son précédent. Donc si à timestamp = 1507190983 la valeur de datareg est 2, la suivante à timestamp 1507190477 est 5, la différence entre 5 et 2 est 3. C'est pourquoi 3 se produit. Rigerta Demiri vous avez raison. Je mets à jour la question. –

Répondre

3

Vous pouvez utiliser la fonction analytique LAG pour lire la valeur précédente dans une partition, par exemple:

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

Cela renverra le changement sur toutes les lignes. Les lignes où il y a un changement auront une valeur data_change> 0. La première ligne aura une valeur NULL car il n'y a pas de ligne précédente.

Malheureusement, vous ne pouvez pas vous référer à data_change dans la clause WHERE. Vous devez utiliser un 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 

Le LAG et les corresponing LEAD fonctions peuvent être utilisées pour détecter les lacunes et les îles dans une séquence aussi bien. Chaque rangée aura un identifiant supérieur au précédent. Dans un écart, la différence sera> 1.