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

これを自分で試すためのテストテーブルを作成するので、まだ機能するかどうかはわかりませんが、試してみる価値はあります。

アップデート 1つのマイナーな問題で修正されました(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 に答える