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
哪有这样做? 在此先感谢!
答
可以使用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。
请问您可以查看您的示例吗? data_change 3来自哪里?为什么在示例1中1列出了两次,5次未列出?此外,我们是在谈论一个真正的时间戳还是由交付系统创建的东西?换句话说:我们可以用它来计算吗? – Tyron78
对于数据值5,您确定您期望时间戳1507190861?根据你的数据,第一次从2变到5时,是1507190477。 –
Tyron78,data_changes是该时间戳处的dataregvalue与其之前的差异。因此,如果在时间戳= 1507190983时dataregvalue为2,则时间戳1507190477的下一个为5,5和2之间的差为3.这就是为什么会出现3。 Rigerta Demiri你是对的。我更新了这个问题。 –