このディレクトリの索引

# 出典 :: SQL質疑応答スレ 9問目 #817 # [テーブルA] # ID, AGE, GROUP # --- ---- ----- # 1 , 10, A # 2 , 20, A # 3 , 30, A # 4 , 20, B # 5 , 40, B # 6 , 60, B # 7 , 10, C # 8 , 30, C # 9 , 50, C # 10 , 70, C # # ↑のテーブルから、 # 各GROUP毎にAGEで順位付けした結果を取得したいです。 # # <結果> # # ID, AGE, GROUP, RANK # --- ---- ----- ----- # 1 , 10, A 1 # 2 , 20, A 2 # 3 , 30, A 3 # 4 , 20, B 1 # 5 , 40, B 2 # 6 , 60, B 3 # 7 , 10, C 1 # 8 , 30, C 2 # 9 , 50, C 3 # 10 , 70, C 4 # # # GROUP BYを使ってみたのですが、 # どうも見当違いのSQLになってしまって。。 # # すいませんが、どのようなSQLを書けばよいかご教示ください。 # テーブルA(8,30,'C'). テーブルA(4,20,'B'). テーブルA(1,10,'A'). テーブルA(10,70,'C'). テーブルA(2,20,'A'). テーブルA(9,50,'C'). テーブルA(6,60,'B'). テーブルA(7,10,'C'). テーブルA(3,30,'A'). テーブルA(5,40,'B'). '各GROUP毎にAGEで順位付けした結果を取得'(X) :- 'GROUPならび'(_GROUPならび), '各GROUP毎にAGEで順位付けした結果を取得'(_GROUPならび,X). 'GROUPならび'(_GROUPならび) :- setof(_GROUP,[_ID,_AGE,_GROUP] ^ テーブルA(_ID,_AGE,_GROUP),_GROUPならび). '各GROUP毎にAGEで順位付けした結果を取得'([],[]) :- !. '各GROUP毎にAGEで順位付けした結果を取得'(_GROUPならび,X) :- '各GROUP毎にAGEで順位付けした結果を取得して行く'(_GROUPならび,X). '各GROUP毎にAGEで順位付けした結果を取得して行く'([_GROUP|R1],X) :- '各GROUP毎にAGEで順位付けした'(_GROUP,L4), '各GROUP毎にAGEで順位付けした結果を取得'(R1,Y), append(L4,Y,X). '各GROUP毎にAGEで順位付けした'(_GROUP,L4) :- '_GROUPのデータの_AGEを整列鍵に'(_GROUP,L2), '整列し_AGEで順位付けした'(L2,L4). '_GROUPのデータの_AGEを整列鍵に'(_GROUP,L2) :- findall([_AGE,_GROUP,_ID],テーブルA(_ID,_AGE,_GROUP),L2). '整列し_AGEで順位付けした'(L2,L4) :- 整列(L2,L3), 'GROUP内の順位づけ'(1,L3,L4). 'GROUP内の順位づけ'(_,[],[]) :- !. 'GROUP内の順位づけ'(N,[[_AGE,_GROUP,_ID]|R1],[[_ID,_AGE,_GROUP,N]|R2]) :- N2 is N + 1, 'GROUP内の順位づけ'(N2,R1,R2). 整列(L1,L2) :- 先頭要素を軸要素として重複要素を許すクイックソート(L1,L2). 先頭要素を軸要素として重複要素を許すクイックソート([],[]). 先頭要素を軸要素として重複要素を許すクイックソート([_軸要素|L1],L2) :- 軸要素に対する大小で二つのならびに分割する(_軸要素,L1,_軸要素と等しいかより小さい要素のならび,_軸要素より大きい要素のならび), 先頭要素を軸要素として重複要素を許すクイックソート(_軸要素と等しいかより小さい要素のならび,L2_1), 先頭要素を軸要素として重複要素を許すクイックソート(_軸要素より大きい要素のならび,L2_2), append(L2_1,[_軸要素|L2_2],L2). 軸要素に対する大小で二つのならびに分割する(_,[],[],[]). 軸要素に対する大小で二つのならびに分割する(_軸要素,[_要素|_残りならび],[_要素|_軸要素と等しいかより小さい要素のならび],_軸要素より大きい要素のならび) :- _軸要素 @>= _要素, 軸要素に対する大小で二つのならびに分割する(_軸要素,_残りならび,_軸要素と等しいかより小さい要素のならび,_軸要素より大きい要素のならび). 軸要素に対する大小で二つのならびに分割する(_軸要素,[_要素|_残りならび],_軸要素と等しいかより小さい要素のならび,[_要素|_軸要素より大きい要素のならび]) :- _軸要素 @< _要素, 軸要素に対する大小で二つのならびに分割する(_軸要素,_残りならび,_軸要素と等しいかより小さい要素のならび,_軸要素より大きい要素のならび).