1

電気メーターの値を記録するテーブルがあります

テーブルはこんな感じ

SELECT created_at, value, delta 
FROM metervalues 
ORDER BY created_at

2013-05-28 07:59:00 | 752105,6 | null
2013-05-28 08:14:00 | 752156,0 | null
2013-05-28 08:29:00 | 752207,2 | null
2013-05-28 08:44:00 | 752259,2 | null
2013-05-28 08:59:00 | 752312,8 | null
2013-05-28 09:14:00 | 752366,4 | null
2013-05-28 09:29:00 | 752417,2 | null

今私は消費量を計算したいので

delta(current record) = value(current record) - value(previous record)

レコードが後で追加される可能性があるため、レコード ID が必ずしも「created_at」の順序に従っているとは限りません。

現在、Ruby スクリプトを使用してデータをロードし、ループしてレコードを更新しています。これは非常に遅いです。

これはSQLダイレクトで解決できますか? カーソルを使用していくつかのサンプルを試しましたが、実際には解決策が見つかりませんでした。

4

2 に答える 2

3

SQL テーブルは本質的に順序付けされていないため、「前の」レコードはありません。順序を指定する列がない限り、この質問は意味がありません。

質問はそのcreated_atようなコラムではないと言っていると思いますが、そうRecordIdです。その場合は、次のlag()関数を使用できます。

select created_at, value,
       (value - lag(value) over (order by recordId)) as delta
from metervalues

そのような ID がない場合は、値の順序を指定する方法を見つける必要があります。

于 2013-06-13T16:31:31.577 に答える