MySQL SELECT ステートメントの行間の差異の計算
MySQL では、SELECT ステートメントの行間の差異の計算は次のように実行できます。さまざまな方法。一般的なアプローチの 1 つは自己結合を利用して、同じテーブル内の行を比較できるようにすることです。次のシナリオを考えてみましょう:
問題ステートメント:
キロメートル、日付、車 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 内でサブクエリを使用して、それぞれの前の行のキロメートルを取得できます。 Record:
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 中国語 Web サイトの他の関連記事を参照してください。