MySQLでグループごとのランキング(最大値からN件取得)

create table xxx
(
nen int,
gaku int
);

insert into xxx values ( 2011,600 );;
insert into xxx values ( 2011,500 );
insert into xxx values ( 2011,450 );
insert into xxx values ( 2011,750 );
insert into xxx values ( 2010,450 );
insert into xxx values ( 2010,540 );
insert into xxx values ( 2010,350 );
insert into xxx values ( 2010,800 );
insert into xxx values ( 2010,700 );

select t.nen, t.gaku
from ( select
@rnk:=if(@prevnen <=> x.nen, if( @prevaku <=> x.gaku, @rnk, @rnk+1), 1 ) as rnk,
@prevnen := x.nen nen,
@prevgaku := x.gaku gaku
from ( select * from xxx order by nen, gaku desc ) as x
cross join ( select @prevnen:=0, @prevgaku:=0, @rnk:=0 ) as dummy ) t
where t.rnk <= 3;

これが結構速い。
ユーザー変数はMySQLの独自機能だし、項目値にnullがある場合はもう一捻りしなければいけないが。
注意点はユーザ変数への代入順序。
今回の場合は@rnkを最初に持ってこないと@prevnen、@pervgakuが上書きされてしまう。
[PR]
by nora1962 | 2011-03-21 11:32 | PC
<< windiwsブートマネージャ... CDOにバグ? >>