我的形式得到了在表傳感器數據:離散導在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