ホームページ  >  記事  >  データベース  >  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 ステートメントの 2 つの行の値の差異を取得するには、適切なメソッドを使用する必要があります。 SELECT および JOIN テクニック。この問題を調べて、利用可能な解決策を調べてみましょう。

提供されたテーブルには、ID、キロメートル、日付、車の ID、車のドライバーなどで整理された行が含まれています。テーブルを正しく並べ替えるには、ORDER BY を含む SELECT ステートメントを使用します。

次に、最後の記録日からのキロメートル数を提供する追加の列「number_km_since_last_date」を含むビューを作成することが目標です。 1 つのアプローチでは 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 中国語 Web サイトの他の関連記事を参照してください。

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