sql >> データベース >  >> RDS >> Mysql

MySQLの連続する行の違いを取得するにはどうすればよいですか?

    MySQL 8の場合 次に、ラグ を使用します ウィンドウ関数。

    SELECT 
        test.id, 
        test.date, 
        test.number, 
        test.qty, 
        IFNULL(test.number - LAG(test.number) OVER w, 0) AS diff,
        ROUND(IFNULL(test.number - LAG(test.number) OVER w, 0)/ test.qty, 2) AS 'Avg'
    FROM purchases test
    WINDOW w AS (ORDER BY test.`date` ASC);
    

    MySQL5.7以下のバージョンの場合

    MySQL変数 を使用できます この仕事をするために。テーブル名がtestであると考えてください 。

    SELECT 
        test.id, 
        test.date, 
        test.number, 
        test.qty, 
        @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff,
        ROUND(@diff / qty, 2) 'avg',
        @prev_number:= test.number as dummy
    FROM 
        test, 
        (SELECT @prev_number:= 0 AS num) AS b
    ORDER BY test.`date` ASC;
    
    -------------------------------------------------------------------------------
    Output:
    
    | id    | date          | number| qty   | diff  | avg   | dummy | 
    -----------------------------------------------------------------
    | 114   | 2018-10-07    | 200   | 5     | 0     | 0.00  | 200   |   
    | 120   | 2018-12-01    | 300   | 10    | 100   | 10.00 | 300   |   
    | 123   | 2019-02-03    | 700   | 12    | 400   | 33.33 | 700   |  
    | 1126  | 2019-03-07    | 1000  | 15    | 300   | 20.00 | 1000  |
    

    説明:

    • (SELECT @prev_number:= 0 AS num) AS b 変数@prev_numberを初期化しました FROM句でゼロになり、テストの各行に結合されます テーブル。
    • @diff:= IF(@prev_number = 0, 0, test.number - @prev_number) AS diff 最初に差分を生成し、次に別の変数 diff を作成します 平均計算に再利用します。また、最初の行の差分をゼロにするための条件を1つ含めました。
    • @prev_number:= test.number as dummy 現在の番号を設定しています この変数に追加するので、次の行で使用できます。

    :両方の違いで、最初にこの変数を使用する必要があります 平均と同様に 次に、新しい値に設定して、次の行が前の行の値にアクセスできるようにします。

    order byをスキップ/変更できます 要件に応じた条項。



    1. XAMPPを介してMySQLを使用するにはどうすればよいですか?

    2. 1045、ユーザー'username' @'NOT-local'のアクセスが拒否されました(パスワードを使用:YES)

    3. Laravel Delete Query Builder

    4. 2つの日付間のMySQL週の計算