このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1316769778/569
#  code | val 
#  ------------ 
#  A | 11 
#  A | 23 
#  A | 34 
#  A | 42 
#  B | 321 
#  B | 112 
#  B | 23 
#  B | 245 
#  というようなテーブルがあり、ここから 
#  同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除 
#  したいのですが、SQL一発でできますか?DBMSはMySQLです。 
#   
#  ↓ほしい結果 
#  code | val 
#  ------------ 
#  A | 11 
#  A | 23 
#  A | 34 
#  B | 112 
#  B | 23 
#  B | 245 
# 
# 

'同じcodeを持つ行が4行以上ある場合、val順で小さい方から3行残してのこりを削除したい' :-
        findsetof(_code,(
                    table(_code,_)),
                  _code候補ならび),
        append(_,[_code|R],_code候補ならび),
        'code毎にvalの小さい順4位以下の組を'(_code,_4位以下の組ならび),
        '削除する'(_4位以下の組ならび),
        R = [].

'code毎にvalの小さい順4位以下の組を'(_code,_4位以下の組ならび) :-
        findall([_val,_code],(
                    table(_code,_val)),
                L1),        
        sort(L1,L2),
        'valの小さい順4位以下の組'(L2,_4位以下の組ならび).

'valの小さい順4位以下の組'([_,_,_|R],R) :- !.
'valの小さい順4位以下の組'(_,[]).

削除する([]).
削除する([[A,B]|R]) :-
        retract(table(B,A)),
        削除する(R).