これは私のお気に入りの 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
現在の行の引用符の値を保持します。
ノート:
order by
句は、通常のウィンドウ関数と同様に重要です。
company
同じ の引用符の差を計算していることを確認するために、ラグを使用することもできますcompany
。
- 同じ方法で行カウンターを実装することもできます
@cnt:=@cnt+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,quote-@quot as change, @quot:=quote curr_quote
from stocks order by company,time) A
order by company,time desc) B where B.LATEST=1;
ネストは相互に関連していないため、(計算的に) 見た目ほど (構文的に) 悪くありません:)
これについて何か助けが必要な場合はお知らせください。