الحصول على أفضل النتائج لكل مجموعة (في Oracle)
-
02-07-2019 - |
سؤال
كيف يمكنني الحصول على نتائج 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 موظفين متميزين جميعهم في نفس المهنة.ولسوء الحظ، فإنه سوف يعطيك كل مجموعات من تلك.
يمكن لأي شخص أن يقلل من هذا من فضلك؟