有幾種方法可以得到結果集。如果您可以在結果集中使用額外的列以及列的順序,那麼類似這樣的操作是可行的。
使用用戶變量
SELECT d.Date
, IF(@prev_units IS NULL
,@diff := 0
,@diff := d.units - @prev_units
) AS `Units_used`
, @prev_units := d.units AS `Units`
FROM (SELECT @prev_units := NULL) i
JOIN (
SELECT t.Date, t.Units
FROM mytable t
ORDER BY t.Date, t.Units
) d
這將返回結果集指定,但它包含單位列,以及。可能會將該列過濾掉,但由於MySQL處理內聯視圖的方式(MySQL稱之爲「派生表」),因此該列更加昂貴。
要刪除多餘的列,可以將其包裝在另一個查詢中...
SELECT f.Date
, f.Units_used
FROM (
query from above goes here
) f
ORDER BY f.Date
但同樣,刪除該列會帶來第二次實現結果集的額外成本。使用
半聯接
如果要保證有一個單獨的行,每個Date
值,或者存儲爲DATE,或作爲與設置爲恆定的timecomponent一個DATETIME,如果有一個丟失的日期值
SELECT t.Date
, t.Units - s.Units AS Units_Used
FROM mytable t
LEFT
JOIN mytable s
ON s.Date = t.Date + INTERVAL -1 DAY
ORDER BY t.Date
:如午夜,在日期值沒有間隙,並且日期被定義爲日期或日期時間數據類型,然後又查詢將返回代表特定的結果集(間隙),使得沒有匹配的前一行,那麼Units_used將具有NULL值。使用
相關子查詢
如果沒有沒有「丟失日期」的保證,但你必須保證,沒有多行特定日期,那麼另一種方法(通常在性能方面更貴)是使用相關子查詢:
SELECT t.Date
, (t.Units - (SELECT s.Units
FROM mytable s
WHERE s.Date < t.Date
ORDER BY s.Date DESC
LIMIT 1)
) AS Units_used
FROM mytable t
ORDER BY t.Date, t.Units
單位和units_used之間的關係是什麼? – 7alhashmi
@ 7alhashmi:units_used只是sql結果中的單位的別名。 –
我的意思是你將如何從列單元獲得unit_used? – 7alhashmi