سؤال

وأنا أود أن أغتنم استعلام بسيط على قائمة الأعضاء التي يتم فهرستها من قبل عدد وتجميعها في "دلاء" متساوية في الحجم. لذا الاستعلام الأساسي كما يلي:

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 وتعيين حقل جماعة مقرها خارج النطاقات التي تريدها.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top