我有表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千瓦时读取所以没有必要为一个消耗值。 这是试图一年计算超过每周千瓦时消耗。
只要给表名的别名,表中的相关子查询不同的别名内。 事情是这样的:
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小提琴演示
这会给你:
| 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 |
COALESCE返回第一个非空值,所以你一定要试试这个查询而不COALESCE,看看什么问题