ssCAROのブログ

色んなとこで見つけたプログラムのメモ置き場っぽい

SQLで前日との差分を求める

DBには日毎の電力量が格納されている。
電力量は累積された値で減ることはない。

DBにはSQL Serverを使用。
*SQLiteでも試したら出来ました。

WHMETER

日時 電力量計A 電力量計B
LOG_TIME METER_A METER_B
2014-09-01 1000 6000
2014-09-02 1100 6050
2014-09-03 1210 6090
2014-09-04 1310 6140
2014-09-05 1430 6200
SELECT
    W2.LOG_TIME AS LOG_TIME
   ,W1.METER_A - W2.METER_A AS METER_A
   ,W1.METER_B - W2.METER_B AS METER_B
FROM
    WHMETER AS W1
   ,WHMETER AS W2
WHERE
    W2.LOG_TIME = (
        SELECT MAX(LOG_TIME)
        FROM WHMETER W3
        WHERE W1.LOG_TIME > W3.LOG_TIME
    )
ORDER BY
    LOG_TIME

結果

LOG_TIME METER_A METER_B
2014-09-01 100 50
2014-09-02 110 40
2014-09-03 100 50
2014-09-04 120 60

2014/09/05分のデータは、2014/09/06のデータが無いため差分計算ができていない。

DBに格納されている電力量の累積値が、999999の次は0に戻ってから、累積する場合は次のSQLで対応する。

SELECT
    W2.LOG_TIME AS LOG_TIME
   ,CASE
    WHEN W1.METER_A - W2.METER_A > 0
    THEN W1.METER_A - W2.METER_A
    ELSE W1.METER_A - W2.METER_A + 1000000
    END AS METER_A
   ,CASE
    WHEN W1.METER_B - W2.METER_B > 0
    THEN W1.METER_B - W2.METER_B
    ELSE W1.METER_B - W2.METER_B + 1000000
    END AS METER_B
FROM
    WHMETER AS W1
   ,WHMETER AS W2
WHERE
    W2.LOG_TIME = (
        SELECT MAX(LOG_TIME)
        FROM WHMETER W3
        WHERE W1.LOG_TIME > W3.LOG_TIME
    )
ORDER BY
    LOG_TIME