これは私のお気に入りの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
にもlagを使用することをお勧めします 同じcompany
の見積もりの差を計算していることを確認するためだけに 。 - 同じ方法で行カウンターを実装することもできます
@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;
ネストは相互に関連していないため、(構文的に)見た目ほど悪くはありません:)
これについてサポートが必要な場合はお知らせください。