mysql вычитает две строки из столбца и помещает в псевдоним

У меня есть таблица meter_readings со столбцами: id, date_taken, kwh.

Я пытаюсь вычесть две строки в столбце kwh вместе и поместить результаты в псевдоним с именем 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

поэтому id 1 = 0, потому что это первое чтение date_taken kwh, поэтому нет необходимости в значении потребления. Это попытка рассчитать недельное потребление кВтч за год.


person Paul Lane    schedule 23.02.2013    source источник


Ответы (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

Для обновленных выборочных данных просто используйте WHERE m2.id = m1.id - 1 внутри коррелированного подзапроса с COALESCE(..., 0), чтобы первым был 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 |
person Mahmoud Gamal    schedule 23.02.2013
comment
Да, это сработало, ура! У меня есть еще один столбец date_taken, есть ли способ поставить 1-й идентификатор как 0, так как это первое показание счетчика, снятое в определенную дату, поэтому не будет значения потребления. Значит, расчет не начинается до id 2? - person Paul Lane; 23.02.2013
comment
@PaulLane - Извините, я не понимаю, вы можете использовать выражение CASE для этого: CASE WHEN date_created = ... then ... else ... end Не могли бы вы отредактировать свой вопрос и добавить этот столбец date_created с обновленными данными образца. будет полезно объяснить это. - person Mahmoud Gamal; 23.02.2013
comment
Только что обновил мой ответ, надеюсь, имеет больше смысла, спасибо. - person Paul Lane; 23.02.2013

COALESCE возвращает первое ненулевое значение, поэтому вам нужно попробовать этот запрос без COALESCE и посмотреть, в чем проблема.

person youssDev    schedule 23.02.2013