我想对一个由数字编制索引的成员列表进行简单查询,并将它们分组为相同大小的“桶”。所以基本查询是:
select my_members.member_index from my_members where my_members.active=1;
假设我得到1000个成员索引号,现在我想通过max和min成员索引将它们分成10个大小相同的组。类似的东西:
0到400之间的活跃成员:100 活跃成员401至577:100 ... 1584年至1765年的活跃成员:100
我能想到的最好的方法是反复查询max(my_members.member_index)并增加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;
end loop;
答案 0 :(得分:2)
使用NTILE分析函数简单快捷:
SELECT member_index, NTILE(10) OVER (ORDER BY member_index) FROM my_members;
Oracle 10g文档:“NTILE是一个分析函数。它将有序数据集划分为expr指示的多个存储桶,并为每一行分配相应的存储桶编号。存储桶编号为1到expr。”
答案 1 :(得分: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
答案 2 :(得分:1)
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项'的高效类型。)
答案 3 :(得分:0)
查看SQL中的CASE语句,并根据您想要的范围设置组字段。