2010-10-21 74 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