MySQL的减去柱和地方两行成一个别名(mysql subtract two rows from c

2019-08-17 02:49发布

我有表meter_readings的列: iddate_takenkwh

我试图减去两行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千瓦时读取所以没有必要为一个消耗值。 这是试图一年计算超过每周千瓦时消耗。

Answer 1:

只要给表名的别名,表中的相关子查询不同的别名内。 事情是这样的:

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 |


Answer 2:

COALESCE返回第一个非空值,所以你一定要试试这个查询而不COALESCE,看看什么问题



文章来源: mysql subtract two rows from column and places into an alias