首页  >  文章  >  数据库  >  如何计算MySQL中连续行的值之间的差异?

如何计算MySQL中连续行的值之间的差异?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-07 04:18:02451浏览

How to Calculate the Difference Between Values in Consecutive Rows in MySQL?

检索 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中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn