11

我在表格中的表格中有传感器数据:

Time      Value
10        100
20        200
36        330
46        440

我想拉动每个时间段的值变化。理想情况下,我想得到:

Starttime Endtime   Change
10        20        100
20        36        130
36        46        110

我的 SQL 技能非常初级,所以我倾向于将所有数据提取到处理它的脚本中,然后将其推回新表,但我想我会问是否有一种巧妙的方法来完成这一切在数据库中。

4

5 回答 5

4
Select a.Time as StartTime, b.time as EndTime, b.time-a.time as TimeChange, b.value-a.value as ValueChange
FROM YourTable a, YourTable b
WHERE b.time = (Select MIN(c.time) FROM YourTable c WHERE c.time>a.time)
于 2010-10-21T11:34:34.040 回答
3
Select a.Time as StartTime
     , b.time as EndTime
     , b.time-a.time as TimeChange
     , b.value-a.value as ValueChange
FROM YourTable a 
Left outer Join YourTable b ON b.time>a.time
Left outer Join YourTable c ON c.time<b.time AND c.time > a.time
Where c.time is null
Order By a.time
于 2010-10-21T11:49:46.167 回答
3

您可以使用 SQL 窗口函数,下面是基于 BIGQUERY 语法的示例。

SELECT 
  LAG(time, 1) OVER (BY time) AS start_time,
  time AS end_time, 
  (value - LAG(value, 1) OVER (BY time))/value AS Change
from data
于 2020-06-26T05:46:25.920 回答
0

首先,我会在表中添加一个 id 列,这样您就可以得到可以预见的逐行增加的内容。

然后,我会尝试以下查询:

SELECT t1.Time AS 'Starttime', t2.Time AS 'Endtime',
    (t2.Value - t1.Value) AS 'Change'
FROM SensorData t1
INNER JOIN SensorData t2 ON (t2.id - 1) = t1.id
ORDER BY t1.Time ASC

我将创建一个测试表来为自己尝试这个,所以我不知道它是否有效,但值得一试!

更新 修复了一个小问题(CHANGE 是一个受保护的词,必须引用),但经过测试,它可以工作!它产生了上面定义的结果。

于 2010-10-21T11:31:48.873 回答
0

这行得通吗?

WITH T AS
(
SELECT [Time]
    ,  Value
    ,  RN1 =  ROW_NUMBER() OVER (ORDER BY [Time])
    ,  RN2 =  ROW_NUMBER() OVER (ORDER BY [Time]) - 1   
FROM  SensorData
)
SELECT  
   StartTime = ISNULL(t1.[time], t2.[time])
 , EndTime = ISNULL(t2.[time], 0)
 , Change = t2.value - t1.value

FROM    T t1 
    LEFT OUTER JOIN 
        T t2

ON t1.RN1 = t2.RN2
于 2010-10-21T12:29:54.940 回答