检索 MySQL SELECT 语句中的列差异
在 MySQL 中,获取 SELECT 语句中两行值之间的差异涉及使用适当的方法选择和连接技术。让我们检查这个问题并探索可用的解决方案。
提供的表包含按 ID、公里、日期、汽车 ID、汽车驾驶员等组织的行。要正确对表进行排序,需要使用带有 ORDER BY 的 SELECT 语句使用子句,生成一个排序表。
接下来,目标是创建一个包含附加列“number_km_since_last_date”的视图,提供自上次记录日期以来的公里数。一种方法采用 INNER JOIN,但由于未排序的行而面临挑战。
使用 LEFT JOIN 和子查询:
更有效的方法涉及使用 LEFT JOIN 组合与子查询。子查询从同一个表中选择小于当前行日期的最大日期。通过将当前行与最大前一行连接起来,可以使用表达式“mt1.Kilometers - IFNULL(mt2.Kilometers, 0)”计算以公里为单位的差值。生成的 SQL 查询是:
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
使用 MySQL Hack 模拟 LAG() 函数:
另一种技术利用模拟 lag() 函数,该函数不是本机的MySQL 中支持。用户定义的变量 @kilo 被初始化为零。在查询中处理每一行时,将从 @kilo 的当前值中减去其公里数,然后将 @kilo 更新为当前公里数。这有效地提供了自上一行以来的公里数差异。结果查询是:
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
以上是如何计算MySQL中连续行的值之间的差异?的详细内容。更多信息请关注PHP中文网其他相关文章!