簡體   English   中英

MySQL從列中減去兩行並放入別名

[英]mysql subtract two rows from column and places into an alias

我的表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 kwh讀數,因此不需要消耗值。 這試圖計算一年中每周的千瓦時消耗量。

只需為表名指定一個別名,然后在相關子查詢中為表指定一個不同的別名即可。 像這樣:

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

對於更新的樣本數據,只需在具有COALESCE(..., 0)的相關子查詢中使用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 |

COALESCE返回第一個非null值,因此您必須在不使用COALESCE的情況下嘗試執行此查詢,然后看看問題出在哪里

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM