فصل SQL النتائج في نطاقات
-
03-07-2019 - |
سؤال
وأنا أود أن أغتنم استعلام بسيط على قائمة الأعضاء التي يتم فهرستها من قبل عدد وتجميعها في "دلاء" متساوية في الحجم. لذا الاستعلام الأساسي كما يلي:
select my_members.member_index from my_members where my_members.active=1;
ويقول أحصل على 1000 الأرقام القياسية عضوا الوراء، والآن أريد أن تقسيمها إلى 10 مجموعات متساوية الحجم من قبل ماكس ومؤشر عضوا دقيقة. شيء من هذا القبيل:
والأعضاء العاملون في 0 إلى 400: 100 أعضاء فاعلين في 401 من خلال 577: 100 ... أعضاء فاعلين في عام 1584 من خلال 1765: 100
وأفضل أتمكن من الخروج مع والاستعلام مرارا وتكرارا لماكس (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;
المحلول
وNTILE هو الطريق للذهاب - تستحق القراءة على الدوال التحليلية لأنها يمكن تبسيط بشكل كبير SQL الخاصة بك
وتعليق صغير على رمز الأصلي - القيام تقييد ROWNUM <م> قبل م> وORDER BY يمكن أن تؤدي إلى نتائج سلبية
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
و(ملاحظة - وراء الكواليس، وأوراكل ترجمة هذا إلى نوع فعال أن يحمل فقط من أي وقت مضى "أعلى 4 عناصر ')
.نصائح أخرى
وانها بسيطة وأسرع بكثير باستخدام الدوال التحليلية NTILE:
SELECT member_index, NTILE(10) OVER (ORDER BY member_index) FROM my_members;
وثائق أوراكل 10g: <م> "NTILE هو الدوال التحليلية ويقسم على البيانات أمر مجموعة الى عدد المجموعات المشار إليها EXPR ويعين عدد دلو المناسب لكل صف يتم ترقيم دلاء من 1 إلى EXPR.". م>
وشكرا للمساعدة. استغرق الأمر بعض الوقت للعمل كل ذلك في عبارة واحدة (لأسباب معينة كان أيضا هدفا)، حتى هنا ما جئت حتى مع ذلك يبدو أنه يعمل بالنسبة لي:
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 وتعيين حقل جماعة مقرها خارج النطاقات التي تريدها.