このディレクトリの索引
http://toro.2ch.net/test/read.cgi/db/1343899481/271
#  Oracle11gR2で 
#   
#  ID  Count 
#  1     3 
#  2     2 
#  3     3 
#   
#  こういうデータを元に 
#   
#  Seq   ID 
#  1     1 
#  2     1 
#  3     1 
#  4     2 
#  5     2 
#  6     3 
#  7     3 
#  8     3 
#   
#  こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい? 
#  Seqはなくてもいい 
# 


'ID  Count 
1     3 
2     2 
3     3 
 
こういうデータを元に 
 
Seq   ID 
1     1 
2     1 
3     1 
4     2 
5     2 
6     3 
7     3 
8     3 
こんな感じのCount(*)の逆を作りたいけど、PL/SQL使わずに作るには、どうしたらいい?'(_テーブル名,_Seq,_ID) :-
        実行項の生成(_テーブル名,_ID,_実行項),
        'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび),
        sort(_ID_頻度ならび,_整列した_ID_頻度ならび),
        'Seq組を生成'(1,_整列した_ID_頻度ならび,_Seq,_ID).

実行項の生成(_テーブル名,_ID,_実行項) :-
        findmax(Nth1,テーブル定義(_テーブル名,Nth1,_),_組の要素数),
        length(L,_組の要素数),
        _実行項 =.. [_テーブル名|L],
        テーブル定義(_テーブル名,_IDの位置,'ID'),
        nth1(_IDの位置,L,_ID).

'IDごとのカウントを取る'(_ID,_実行項,_ID_頻度ならび) :-
        setof(_ID,[_ID,_実行項] ^_実行項,_IDならび),
        findall([_ID,_頻度],(
                    member(_ID,_IDならび),
                    count(_実行項,_頻度ならび)),_ID_頻度ならび).

'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :-
        N_2 is N_1 + _頻度 - 1,
        between(N_1,N_2,_Seq).
'Seq組を生成'(N_1,[[_ID,_頻度]|R],_Seq,_ID) :-
        N_2 is N_1 + _頻度,
        'Seq組を生成'(N_2,R,_Seq,_ID).