このディレクトリの索引
#  出題場所 :: http://toro.2ch.net/test/read.cgi/db/1371476534/577
#  こんなSQLがあります。 
#   
#  select id, name, utime 
#  from something 
#  order by utime desc; 
#   
#  このとき、idが、ある指定された値までは読み飛ばし、それ以降のレコードを取得するにはどうしたらいいですか。 
#  ポイントは、 
#  * id順とutime順とで順番が異なること 
#  * ソートキーは utime だが、読み飛ばす条件は id を使っていること 
#   
#  whileループなら簡単な処理ですが、SQLだとどうするのでしょうか。 
#   
#  (使用DB: PostgreSQL 9.3) 
# 

'こんなSQLがあります。 
select id, name, utime 
from something
order by utime desc;

idが、ある指定された値までは読み飛ばし、それ以降のレコードを取得する'(_指定された値,_id,_name,_utime) :-
'idが、ある指定された値までは読み飛ばし、'(_指定された値,_それ以降),
それ以降のレコードを取得する(_それ以降,_id,_name,_utime).

'idが、ある指定された値までは読み飛ばし、'(_指定された値,_それ以降) :-
findall([_utime,_id,_name],something(_id,_name,_utime),LL1),
降順整列(LL1,LL2),
append(_,[[_,_指定された値,_]|_それ以降],LL2),!.

それ以降のレコードを取得する(_それ以降,_id,_name,_utime) :-
member([_utime,_id,_name],_それ以降).


降順整列([],[]).
降順整列([_軸要素|_残りならび],_降順に整列したならび) :-
軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,_残りならび,_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび),
それぞれのならびを降順に整列する(_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび,_降順整列ならび_1,_降順整列ならび_2),
append(_降順整列ならび_1,[_軸要素|_降順整列ならび_2],_降順に整列したならび).

軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[],[],[]) :- !.
軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[A|R1],[A|R2],R3) :-
A @> _軸要素,
軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,R1,R2,R3).
軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,[A|R1],R2,[A|R3]) :-
A @=< _軸要素,
軸要素より大きい要素ならびと等しいか小さい要素要素ならびに分割(_軸要素,R1,R2,R3).

それぞれのならびを降順に整列する(_軸要素より大きい要素ならび,_軸要素に等しいか小さい要素ならび,_降順整列ならび_1,_降順整列ならび_2) :-
降順整列(_軸要素より大きい要素ならび,_降順整列ならび_1),
降順整列(_軸要素に等しいか小さい要素ならび,_降順整列ならび_2),!.