質問
数字でインデックス付けされたメンバーのリストで簡単なクエリを実行し、それらを同じサイズの「バケット」にグループ化します。基本クエリは次のとおりです。
select my_members.member_index from my_members where my_members.active=1;
1000個のメンバーインデックス番号が返されたとしたら、最大および最小のメンバーインデックスによって、それらを10個の同じサイズのグループに分割します。次のようなもの:
0から400のアクティブなメンバー:100 401から577のアクティブメンバー:100 ... 1584年から1765年にアクティブなメンバー:100
思いつく最高の方法は、rownumの制限を増やしてmax(my_members.member_index)を繰り返しクエリすることです:
for r in 1 .. 10 loop
select max(my_members.member_index)
into ranges(r)
from my_members
where my_members.active = 1
and rownum < top_row
order by my_members.member_index asc;
top_row := top_row + 100;
end loop;
解決
NTILEが道のりです-SQLを大幅に簡素化できるので、分析関数を読む価値があります。
元のコードに対する小さなコメント-ORDER BYの前に rownum制限を行うと、悪影響が生じる可能性があります
for r in 1 .. 10 loop
select max(my_members.member_index)
into ranges(r)
from my_members
where my_members.active = 1
and rownum < top_row
order by my_members.member_index asc;
top_row := top_row + 100;
ループの終了;
次を試してください:
create table example_nums (numval number)
begin
for i in 1..100 loop
insert into example_nums values (i);
end loop;
end;
SELECT numval FROM example_nums
WHERE rownum < 5
ORDER BY numval DESC;
必要な結果を得るには、行う必要があります
SELECT numval FROM
(SELECT numval FROM example_nums
ORDER BY numval DESC)
WHERE rownum < 5
(注-舞台裏では、Oracleはこれを「上位4項目」のみを保持する効率的なソートに変換します)。
他のヒント
NTILE分析関数を使用すると、シンプルではるかに高速になります。
SELECT member_index, NTILE(10) OVER (ORDER BY member_index) FROM my_members;
Oracle 10gドキュメント:&quot; NTILEは分析関数です。順序付けられたデータセットをexprで示される複数のバケットに分割し、適切なバケット番号を各行に割り当てます。バケットには1〜exprの番号が付けられます。&quot;
助けてくれてありがとう。すべてを1つのステートメントにまとめるのにしばらく時間がかかりました(特定の理由により、これも目標でした)。
select max(member_index), ranger
from (SELECT member_index,
CASE
WHEN rownum < sized THEN 1
WHEN rownum < sized*2 THEN 2
WHEN rownum < sized*3 THEN 3
WHEN rownum < sized*4 THEN 4
WHEN rownum < sized*5 THEN 5
WHEN rownum < sized*6 THEN 6
WHEN rownum < sized*7 THEN 7
WHEN rownum < sized*8 THEN 8
WHEN rownum < sized*9 THEN 9
ELSE 10
END ranger
from my_members,
(select count(*) / 10 sized
from my_members
where active = 1)
where active = 1
order by member_index)
group by ranger;
次のような結果をください:
member_index ranger
2297683 1
2307055 2
2325667 3
2334819 4
2343982 5
2353325 6
2362247 7
6229146 8
8189767 9
26347329 10
SQLのCASEステートメントを見て、必要な範囲に基づいてグループフィールドを設定します。