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