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

MySQLでラグ関数をシミュレートする

    これは私のお気に入りのMySQLハックです。

    ラグ関数をエミュレートする方法は次のとおりです。

    SET @quot=-1;
    select time,company,@quot lag_quote, @quot:=quote curr_quote
      from stocks order by company,time;
    
    • lag_quote 前の行の引用符の値を保持します。最初の行の@quotは-1です。
    • curr_quote 現在の行の引用の値を保持します。

    注:

    1. order by ここでは、通常のウィンドウ関数の場合と同様に、句が重要です。
    2. companyにもlagを使用することをお勧めします 同じcompanyの見積もりの​​差を計算していることを確認するためだけに 。
    3. 同じ方法で行カウンターを実装することもできます@cnt:[email protected]+1

    このスキームの良いところは、集計関数、ストアドプロシージャの使用、アプリケーションサーバーでのデータ処理など、他のいくつかのアプローチと比較して、計算量が非常に少ないことです。

    編集:

    今、あなたが言及した形式で結果を得るというあなたの質問に来ています:

    SET @quot=0,@latest=0,company='';
    select B.* from (
    select A.time,A.change,IF(@comp<>A.company,1,0) as LATEST,@comp:=A.company as company from (
    select time,company,[email protected] as change, @quot:=quote curr_quote
    from stocks order by company,time) A
    order by company,time desc) B where B.LATEST=1;
    

    ネストは相互に関連していないため、(構文的に)見た目ほど悪くはありません:)

    これについてサポートが必要な場合はお知らせください。



    1. MariaDBでのCHAR()のしくみ

    2. 特定のスキーマにテーブルが存在するかどうかを確認する方法

    3. ネストされたクラス-CustomRowMapper!!もう問題ありません!! - パート1

    4. OracleでNVL()関数を使用する方法