Sql server sql server选择第一次发生的数据更改
我有一个sql server 2008 r2数据库 我有一个名为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
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数据库