2

列を持つテーブルmeter_readingsがあります: iddate_takenkwh

kwhcolumn の 2 つの行を一緒に減算し、結果を というエイリアスに入れようとしていますconsumption

私は使用しています:

SELECT id, kwh COALESCE(kwh-(SELECT kwh FROM meter_readings WHERE id= id+1), kwh) AS consumption 
FROM meter_readings; 

消費エイリアスで返されるものは、元と同じように単純kwhです:

 id   date_taken        kwh        consumption 
  1   2013-01-01      4567.89       4567.89 
  2   2013-01-08      4596.71       4596.71  
  3   2013-01-15      4607.89       4607.89

私が欲しいのは:

 id   date_taken        kwh        consumption 
  1   2013-01-01      4567.89          0
  2   2013-01-08      4596.71        28.11
  3   2013-01-15      4607.89        11.18

これは最初の date_taken kwh 読み取り値であるため、id 1 = 0 であり、消費値は必要ありません。これは、1 年間の毎週の kwh 消費量を計算しようとしています。

4

2 に答える 2

2

テーブル名にエイリアスを付け、相関サブクエリ内のテーブルに別のエイリアス名を付けるだけです。このようなもの:

SELECT 
  m1.id, 
  m1.kwh,
  COALESCE(m1.kwh - (SELECT m2.kwh 
                     FROM meter_readings AS m2
                     WHERE m2.id = m1.id + 1),
           m1.kwh) AS consumption 
FROM meter_readings AS m1; 

SQL フィドルのデモ

これにより、次のことが得られます。

| ID |     KWH | CONSUMPTION |
------------------------------
|  1 | 4567.89 |     1141.18 |
|  2 | 3426.71 |     1181.37 |
|  3 | 2245.34 |     2245.34 |

更新 1

更新されたサンプル データの場合、最初のサブクエリが 0 になるようにWHERE m2.id = m1.id - 1、相関サブクエリ内で使用するだけです。次のようにします。COALESCE(..., 0)

SELECT 
  m1.id, 
  date_format(m1.date_taken, '%Y-%m-%d') AS date_taken,
  m1.kwh,
  COALESCE(m1.kwh - (SELECT m2.kwh 
                     FROM meter_readings m2
                     WHERE m2.id = m1.id - 1), 0) AS consumption 
FROM meter_readings m1; 

更新された SQL Fiddle デモ

これにより、次のことが得られます。

| ID | DATE_TAKEN |     KWH | CONSUMPTION |
-------------------------------------------
|  1 | 2013-01-01 | 4567.89 |           0 |
|  2 | 2013-01-08 | 4596.71 |       28.82 |
|  3 | 2013-01-15 | 4607.89 |       11.18 |
于 2013-02-23T08:55:29.887 に答える
0

COALESCE は最初の null 以外の値を返すため、COALESCE を使用せずにこのクエリを試して、問題を確認する必要があります。

于 2013-02-23T08:55:59.523 に答える