2010-10-21 50 views
6

我的形式得到了在表传感器数据:离散导在SQL

Time  Value 
10  100 
20  200 
36  330 
46  440 

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

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

我SQL技能是很基本的,所以我的倾向是把所有的数据到该进程,然后将其推回新表的脚本,但我想我会问,在数据库中是否有这样的方法可以做到这一点。

+0

会使一个优秀的面试问题:微不足道的制定,但不平凡的解决。 – 2010-10-21 12:36:22

+0

+1,因为你足够聪明,不只是按照你已经知道并提出问题的方式去做。 – Kuberchaun 2010-10-21 18:43:10

回答

1
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 
+0

这对我来说似乎有点低效。当一个连接足够时,做2个连接是否合理?看到这个答案http://stackoverflow.com/questions/6299950/sql-difference-between-rows – 2012-04-02 23:36:26

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 

我要创建一个测试表来尝试一下本作自己,所以我不知道,如果它的工作原理尚未,但它是值得一试!

更新 修复了一个小问题(更改是一个受保护的词,必须引用),但测试它,它的工作原理!它会生成上面定义的结果。

+0

只有按顺序插入行(按startTime),才会有效,并且不会删除任何行;删除一行将导致一个间隙,所以t2.id - t1.id将> 1 – Andy 2010-10-21 11:56:24

+0

事实上,你是对的,但鉴于数据的性质(即来自传感器),我期望行是正确的顺序和删除行将不太可能(我猜),因为它实际上是数据中的差距。 – 2010-10-21 12:24:23

2
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) 
+0

对我的表格副本进行了测试,它也可以工作。我喜欢添加的时间变化以及价值变化:) – 2010-10-21 11:40:21

+0

也看到我的其他答案,它避免了子查询。 – Andy 2010-10-21 14:46:00

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 
+0

将工作的SQL Server,但我现在认识到,没有标记。 – 2010-10-21 12:34:29