首页  >  文章  >  数据库  >  如何计算 MySQL SELECT 语句的行差异?

如何计算 MySQL SELECT 语句的行差异?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-10 10:05:02363浏览

How do you calculate the difference in rows of a MySQL SELECT statement?

计算 MySQL SELECT 语句的行之间的差异

在 MySQL 中,计算 SELECT 语句的行之间的差异可以通过以下方式完成各种方法。一种常见的方法是利用自联接,使您能够比较同一表中的行。考虑以下场景:

问题陈述:

您有一个包含车辆数据的表,包括公里数、日期、汽车 ID 和驾驶员。然而,由于数据输入顺序不同,数据可能未排序。您的目标是创建一个视图,显示自上次输入以来每个汽车驾驶员组合的行驶公里数,从而产生以下格式:

ID | Kilometers | date       | car_id | car_driver | number_km_since_last_date   
 1 | 100        | 2012-05-04 | 1 | 1 | 0  
 2 | 200        | 2012-05-08 | 1 | 1 | 100  
 4 | 600        | 2012-05-16 | 1 | 1 | 400  
 3 | 1000       | 2012-05-25 | 1 | 1 | 400

解决方案 1:使用子查询连接

您可以在 INNER JOIN 中使用子查询来检索每个行的前一行公里数记录:

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

在此查询中,子查询选择当前行日期之前的最大日期,然后将此最大日期与 LEFT JOIN 中的记录匹配。

解决方案2:模拟Lag函数

MySQL不提供内置的lag()函数,但您可以通过用户定义的变量来模仿其行为:

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 存储前一行的公里数。每次迭代,用户定义的变量都会更新,有效跟踪公里数的变化。

以上是如何计算 MySQL SELECT 语句的行差异?的详细内容。更多信息请关注PHP中文网其他相关文章!

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