有几种方法可以获得结果集。如果您可以在结果集中使用额外的列以及列的顺序,那么这样的方法是一种可行的方法。
使用用户变量
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
这将返回指定的结果集,但它也包括 Units 列。可以过滤掉该列,但成本更高,因为 MySQL 处理内联视图的方式(MySQL 将其称为“派生表”)
要删除该额外列,您可以将其包装在另一个查询中......
SELECT f.Date
, f.Units_used
FROM (
query from above goes here
) f
ORDER BY f.Date
但同样,删除该列会带来第二次实现该结果集的额外成本。
使用半连接
如果保证每个Date
值都有一行,或者存储为 DATE,或者存储为 DATETIME,时间分量设置为常数,例如午夜,并且 Date 值中没有间隙,并且 Date 定义为 DATE 或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
如果缺少 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