我的形式得到了在表传感器数据:离散导在SQL
Time Value
10 100
20 200
36 330
46 440
我想拉变化值,每个时间段。理想情况下,我想获得:
Starttime Endtime Change
10 20 100
20 36 130
36 46 110
我SQL技能是很基本的,所以我的倾向是把所有的数据到该进程,然后将其推回新表的脚本,但我想我会问,在数据库中是否有这样的方法可以做到这一点。
我的形式得到了在表传感器数据:离散导在SQL
Time Value
10 100
20 200
36 330
46 440
我想拉变化值,每个时间段。理想情况下,我想获得:
Starttime Endtime Change
10 20 100
20 36 130
36 46 110
我SQL技能是很基本的,所以我的倾向是把所有的数据到该进程,然后将其推回新表的脚本,但我想我会问,在数据库中是否有这样的方法可以做到这一点。
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
这对我来说似乎有点低效。当一个连接足够时,做2个连接是否合理?看到这个答案http://stackoverflow.com/questions/6299950/sql-difference-between-rows – 2012-04-02 23:36:26
首先,我会在表格中添加一个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
我要创建一个测试表来尝试一下本作自己,所以我不知道,如果它的工作原理尚未,但它是值得一试!
更新 修复了一个小问题(更改是一个受保护的词,必须引用),但测试它,它的工作原理!它会生成上面定义的结果。
只有按顺序插入行(按startTime),才会有效,并且不会删除任何行;删除一行将导致一个间隙,所以t2.id - t1.id将> 1 – Andy 2010-10-21 11:56:24
事实上,你是对的,但鉴于数据的性质(即来自传感器),我期望行是正确的顺序和删除行将不太可能(我猜),因为它实际上是数据中的差距。 – 2010-10-21 12:24:23
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-21 11:40:21
也看到我的其他答案,它避免了子查询。 – Andy 2010-10-21 14:46:00
工作的呢?
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
将工作的SQL Server,但我现在认识到,没有标记。 – 2010-10-21 12:34:29
会使一个优秀的面试问题:微不足道的制定,但不平凡的解决。 – 2010-10-21 12:36:22
+1,因为你足够聪明,不只是按照你已经知道并提出问题的方式去做。 – Kuberchaun 2010-10-21 18:43:10