ホームページ  >  記事  >  データベース  >  MySQL テーブルの行間のキロメートルの差を計算するにはどうすればよいですか?

MySQL テーブルの行間のキロメートルの差を計算するにはどうすればよいですか?

DDD
DDDオリジナル
2024-11-08 20:03:02559ブラウズ

How to Calculate Kilometer Differences Between Rows in a MySQL Table?

MySQL SELECT ステートメント内の行間の差異の計算

このシナリオでは、キロメートル、日付、と車の情報が表示されますが、必ずしも時系列順であるとは限りません。目標は、各車の最後の日付からのキロメートル数を表示する追加の列を含むビューを作成することです。

これを達成するには、データが次のとおりであるため、ID 列での単純な JOIN に依存することはできません。時系列順に並べていない。代わりに、LEFT JOIN とサブクエリを使用して、各行の現在の日付より前の最大日付を決定する必要があります。

LEFT JOIN とサブクエリの使用

次のクエリは、LEFT JOIN を使用して、現在のテーブル行 (mt1) を、mt1 の日付より前の最大の日付を持つ行 (mt2) に接続します。

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 ではネイティブにサポートされていない 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 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。