سؤال

كيف يمكنني الحصول على نتائج N لعدة مجموعات في استعلام Oracle.

على سبيل المثال، في ضوء الجدول التالي:

|--------+------------+------------|
| emp_id | name       | occupation |
|--------+------------+------------|
|      1 | John Smith | Accountant |
|      2 | Jane Doe   | Engineer   |
|      3 | Jack Black | Funnyman   |
|--------+------------+------------|

هناك العديد من الصفوف التي تحتوي على المزيد من المهن.أود الحصول على ثلاثة موظفين (دعنا نقول) من كل مهنة.

هل هناك طريقة للقيام بذلك دون استخدام استعلام فرعي؟

هل كانت مفيدة؟

المحلول

يؤدي هذا إلى إنتاج ما تريد، ولا يستخدم أي ميزات SQL خاصة بالبائع مثل TOP N أو RANK().

SELECT MAX(e.name) AS name, MAX(e.occupation) AS occupation 
FROM emp e 
  LEFT OUTER JOIN emp e2 
    ON (e.occupation = e2.occupation AND e.emp_id <= e2.emp_id) 
GROUP BY e.emp_id 
HAVING COUNT(*) <= 3 
ORDER BY occupation;

في هذا المثال، يتم إعطاء الموظفين الثلاثة ذوي أقل قيم emp_id لكل مهنة.يمكنك تغيير السمة المستخدمة في مقارنة عدم المساواة، لجعلها تعطي أفضل الموظفين بالاسم، أو أي شيء آخر.

نصائح أخرى

ليس لدي مثيل أوراكل مفيد الآن لذا لم أختبر هذا:

select *
from (select emp_id, name, occupation,
      rank() over ( partition by occupation order by emp_id) rank
      from employee)
where rank <= 3

وهذا رابط لكيفية عمل الرتبة: http://www.psoug.org/reference/rank.html

أضف RowNum إلى الترتيب:

select * from 
         (select emp_id, name, occupation,rank() over ( partition by occupation order by emp_id,RowNum) rank   
                      from employee) 
         where rank <= 3 

اختبر هذا في SQL Server (ويستخدم الاستعلام الفرعي)

select emp_id, name, occupation
from employees t1
where emp_id IN (select top 3 emp_id from employees t2 where t2.occupation = t1.occupation)

ما عليك سوى إجراء طلب في الاستعلام الفرعي ليناسب احتياجاتك

لست متأكدًا من أن هذا فعال للغاية، ولكن ربما يكون مكانًا للبدء؟

select *
from people p1
    join people p2
        on p1.occupation = p2.occupation
    join people p3
        on p1.occupation = p3.occupation
        and p2.occupation = p3.occupation
where p1.emp_id != p2.emp_id
    and p1.emp_id != p3.emp_id

من المفترض أن يمنحك هذا صفوفًا تحتوي على 3 موظفين متميزين جميعهم في نفس المهنة.ولسوء الحظ، فإنه سوف يعطيك كل مجموعات من تلك.

يمكن لأي شخص أن يقلل من هذا من فضلك؟

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