计算 MySQL SELECT 语句中行之间的差异
在这种情况下,您有一个 MySQL 表,其中包含公里、日期、和汽车信息,但可能并不总是按时间顺序排列。您的目标是创建一个视图,其中包含一个附加列,显示每辆车自上次日期以来的公里数。
要实现此目的,您不能依赖于 ID 列上的简单 JOIN,因为数据是不按时间顺序排序。相反,您需要使用 LEFT JOIN 和子查询来确定每行当前日期之前的最大日期。
使用 LEFT JOIN 和子查询
以下查询使用 LEFT JOIN 将当前表行 (mt1) 与具有最大日期的行 (mt2) 连接起来早于 mt1 的日期:
SELECT mt1.ID, mt1.Kilometers, mt1.date, mt1.Kilometers - IFNULL(mt2.Kilometers, 0) AS number_km_since_last_date FROM myTable mt1 LEFT JOIN myTable mt2 ON mt2.Date = ( SELECT MAX(Date) FROM myTable mt3 WHERE mt3.Date < mt1.Date ) ORDER BY mt1.date
此查询计算当前行 (mt1) 的公里数与最大日期早于当前日期 (mt2) 的行的公里数之间的差值。如果 mt2 为 NULL,则意味着没有前一行,因此差值为 0。
使用 MySQL Hackery 的替代方法
作为替代方法,您可以使用MySQL hack 来模拟 lag() 函数,MySQL 本身不支持该函数:
SET @kilo=0; SELECT mt1.ID, mt1.Kilometers - @kilo AS number_km_since_last_date, @kilo := mt1.Kilometers Kilometers, mt1.date FROM myTable mt1 ORDER BY mt1.date
此查询使用用户定义的变量 (@kilo) 用于跟踪先前的公里值。当前公里值与 @kilo 之间的差异为您提供自上次日期以来的公里数。每行处理完毕后,@kilo 变量都会更新为当前公里值。
以上是如何计算 MySQL 表中行之间的公里差?的详细内容。更多信息请关注PHP中文网其他相关文章!