ホームページ >データベース >mysql チュートリアル >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 サイトの他の関連記事を参照してください。