このディレクトリの索引
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の小さい順最大3件'(_code,L),
        '最大3件を書き戻す'(L),
        R = [].

'code毎にvalの小さい順最大3件'(_code,L) :-
        findall([_val,_code],(
                    retract(table(_code,_val))),
                L1),        
        sort(L1,L2),
        'valの小さい順最大3件'(L1,L).

'valの小さい順最大3件'([],[]).
'valの小さい順最大3件'([[A1,B1],[A2,B2],[A3,B3]|_],[[B1,A1],[B2,A2],[B3,A3]]) :-
        !.
'valの小さい順最大3件'([[A,B]|R1],[[B,A]|R2]) :-
        'valの小さい順最大3件'(R1,R2).

'最大3件を書き戻す'([]).
'最大3件を書き戻す'([[A,B]|R]) :-
        assertz(table(A,B)),
        '最大3件を書き戻す'(R).