Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server sql server选择第一次发生的数据更改_Sql Server_Sql Server 2008 R2_Gaps And Islands - Fatal编程技术网

Sql server sql server选择第一次发生的数据更改

Sql server sql server选择第一次发生的数据更改,sql-server,sql-server-2008-r2,gaps-and-islands,Sql Server,Sql Server 2008 R2,Gaps And Islands,我有一个sql server 2008 r2数据库 我有一个名为hystrealdata的表,其中每n秒存储一台汽车的生产数据。因此,其结构如下: dataregvalue timestamp -------------------------------------------------------------------------- 0

我有一个sql server 2008 r2数据库

我有一个名为
hystrealdata
的表,其中每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      
dataregvalue      data_change      timestamp             
---------------------------------------------
    0             0                1507190476
    1             1                1507190719
    2             1                1507190861
    5             3                1507190477
我需要选择第一行中第一个出现的
dataregvalue
,然后选择下一个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 
如何做到这一点? 提前谢谢

您可以使用分析函数读取分区中的上一个值,例如:

Select 
    dataregvalue,
    dataregvalue - LAG(dataregvalue,1) OVER (ORDER BY timestamp) as data_change,
    timestamp
from MyTable
这将返回所有行上的更改。发生更改的行将具有
data\u change
value>0。第一行将具有空值,因为没有上一行

不幸的是,您不能在WHERE子句中引用
data\u 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
功能也可用于检测序列中的间隙和孤岛。每一行的ID都比前一行大一个。在间隙中,差值将大于1

你能回顾一下你的例子吗?数据_change 3从何而来?为什么在示例1中1列出了两次,而5根本没有列出?此外,我们谈论的是真实的时间戳还是交付系统创建的东西?换句话说:我们可以用它计算吗?对于数据值5,您确定您期望时间戳1507190861吗?第一次从2更改为5时,根据您的数据为1507190477。Tyron78,数据_更改是该时间戳处的dataregvalue与其以前的值之间的差值。因此,如果在时间戳=1507190983处,dataregvalue为2,则在时间戳1507190477处的下一个值为5,5和2之间的差值为3。这就是为什么会出现3。里格塔·德米里你是对的。我更新了问题。SQL Server 2008R2?你应该使用正确的标签。无论如何,它不再受支持,最早支持的版本是2012年。从2016年SP1开始,即使在Express中,您也可以使用压缩、列存储、内存中的表—现在您可以用Express替换一些生产2K8R2数据库