2008-09-25 16 views
7

के लिए शीर्ष परिणाम प्राप्त करें मैं में एक ऑर्केकल क्वेरी में कई समूहों के लिए एन परिणाम कैसे प्राप्त कर पाऊंगा।प्रत्येक समूह (ओरेकल में)

उदाहरण के लिए

, निम्न तालिका दिया:

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

अधिक व्यवसायों के साथ कई और पंक्तियों रहे हैं। मैं प्रत्येक व्यवसाय से तीन कर्मचारियों (कहने देता हूं) प्राप्त करना चाहता हूं।

क्या उपकुमारी का उपयोग किए बिना ऐसा करने का कोई तरीका है?

उत्तर

11

यह आपके द्वारा इच्छित चीज़ों का उत्पादन करता है, और यह कोई विक्रेता-विशिष्ट SQL विशेषताओं जैसे टॉप एन या रैंक() का उपयोग करता है।

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

इस उदाहरण में यह तीन कर्मचारियों को प्रति व्यवसाय सबसे कम emp_id मान प्रदान करता है। आप असमानता तुलना में उपयोग की गई विशेषता को बदल सकते हैं, ताकि इसे शीर्ष कर्मचारियों को नाम, या जो भी हो।

+3

मुझे लगता है कि यह ग्रुप बाय क्लॉज पर असफल हो जाएगा। आपकी चयन सूची में कोई कुल कार्य नहीं है। – jop

+1

मैंने इसे पोस्ट करने से पहले इस क्वेरी का परीक्षण किया था। एसक्यूएल को ग्रुप बाय का उपयोग करने के लिए कुल कार्यों की आवश्यकता नहीं है। –

2

मुझे यकीन नहीं है कि यह बहुत ही कुशल है, लेकिन शायद एक प्रारंभिक स्थान है?

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 अलग-अलग कर्मचारी शामिल हैं। दुर्भाग्यवश, यह आपको उन सभी संयोजनों को देगा।

क्या कोई इसे नीचे रख सकता है?

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

यहाँ कैसे रैंक काम करता है पर एक लिंक है:

28

मैं तो मैं परीक्षण नहीं किया यह एक Oracle उदाहरण काम नहीं है अभी एसक्यूएल सर्वर में http://www.psoug.org/reference/rank.html

+2

फ्लॉप वह एक सबक्वेरी के बिना निर्दिष्ट ...? – AviD

+1

हां, लेकिन हो सकता है कि वह "सबकुछ का उपयोग किए बिना एक ही तालिका से चयन करता है" का अर्थ हो सकता है। यह समाधान एक सबक्वायरी का उपयोग करता है लेकिन केवल एक बार तालिका तक पहुंचता है। –

2

इस परीक्षण किया (और इसे इस्तेमाल करता है सबक्वेरी)

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) 

सिर्फ आपकी आवश्यकताओं के अनुरूप सबक्वेरी में से एक आदेश कर

2

जोड़े ROWNUM रैंक करने के लिए:

select * from 
     (select emp_id, name, occupation,rank() over (partition by occupation order by emp_id,RowNum) rank 
         from employee) 
     where rank <= 3 
संबंधित मुद्दे