2010-08-03 14 views
8

में ऑर्डर के बाद शीर्ष पंक्ति प्राप्त करें मेरे पास एक टेबल छात्र (आईडी, नाम, विभाग, आयु, स्कोर) है। मैं सबसे कम उम्र के छात्र को ढूंढना चाहता हूं, जो प्रत्येक विभाग के उच्चतम (सबसे कम उम्र के छात्रों में) स्कोर प्राप्त करें। SQL सर्वर में, मैं निम्न SQL का उपयोग कर सकता हूं।ओरेकल सबक्वायरी

select * from student s1 
where s1.id in 
(select s2.id from student s2 
where s2.department = s1.department order by age asc, score desc top 1). 

हालांकि, Oracle में, आप खंड द्वारा सबक्वेरी में उपयोग नहीं कर सकते हैं और वहाँ कीवर्ड की तरह कोई सीमा नहीं/शीर्ष है। परिणाम के लिए मुझे दो बार छात्र तालिका में शामिल होना है। ओरेकल में, मैं निम्नलिखित एसक्यूएल का उपयोग करता हूं।

select s1.* from student s1, 
(select s2.department, s2.age, max(s2.score) as max_score from student s2, 
(select s3.department, min(s3.age) as min_age from student s3 group by s3.department) tmp1 where 
s2.department = tmp1.department and s2.age = tmp1.min_age group by s2.department, s2.age) tmp2 
where s1.department =tmp2.department and s1.age = tmp2.age and s1.score=tmp2.max_score 

क्या किसी को ओरेकल के लिए उपरोक्त एसक्यूएल को सरल बनाने का कोई विचार है।

+1

ओरेकल में, आप * * एक सबक्वेरी में खंड द्वारा आदेश का उपयोग कर सकते हैं। –

+0

विश्लेषणात्मक कार्यों के बिना एक समाधान बहुत आसान है, मेरे प्रश्न के स्वीकृत उत्तर को देखें: http://stackoverflow.com/questions/38180445/oracle-left-join-very-big-table-and-limit-the-joined बड़े-बड़े – Dany

उत्तर

24

यह एक

select * from 
    (SELECT id, name, department, age, score, 
    ROW_NUMBER() OVER (partition by department order by age desc, score asc) srlno 
    FROM student) 
where srlno = 1; 
+0

के साथ-साथ मेरे पास समान परिदृश्य था, जिसे पीएल/एसक्यूएल ब्लॉक का उपयोग करके संभालने के लिए सोचा गया था, लेकिन आपका समाधान पूरी तरह से काम करता था !! – Rakesh

5

भारत के जवाब के अलावा कोशिश है, यह (जेफरी केम्प से बाहर बिंदु के रूप में) Oracle में उप क्वेरी में इस आदेश को का उपयोग कर ऐसा करने के लिए संभव है:

SELECT * 
FROM student s1 
WHERE s1.id IN (SELECT id 
       FROM (SELECT id, ROWNUM AS rn 
         FROM  student s2 
         WHERE s1.department = s2.department 
         ORDER BY age ASC, score DESC) 
       WHERE rn = 1); 

यदि आप इस विधि का उपयोग करते हैं, तो आप उप-क्वेरी को हटाने का प्रयास कर सकते हैं और केवल rownum = 1 का उपयोग कर सकते हैं। इसके परिणामस्वरूप गलत परिणाम होगा क्योंकि मानदंड के बाद सॉर्ट लागू किया जाएगा (आपको क्रमबद्ध 1 पंक्ति मिल जाएगी, सॉर्ट किए गए सेट से एक पंक्ति नहीं)।

+0

सवाल वास्तव में "प्रत्येक विभाग" की शीर्ष पंक्ति पूछता है। आप परिणामों को समूहित करने के लिए विचलन का उपयोग नहीं कर रहे हैं। शायद यह उत्तर प्रश्न सामग्री पढ़ने के बिना शीर्षक के समान प्रश्नों को देखने वाले लोगों के लिए उपयोगी है। लेकिन मैं समाधान की तुलना करने वाले लोगों के लिए अंतर को इंगित करना चाहता हूं (क्योंकि उन्हें एक ही परिणाम नहीं मिलेगा)। –

+0

@ संरक्षक: अच्छा पकड़ो! मैंने जवाब अपडेट किया है। – Allan

1
select to_char(job_trigger_time,'mm-dd-yyyy') ,job_status from 
(select * from kdyer.job_instances ji INNER JOIN kdyer.job_param_values pm 
on((ji.job_id = pm.job_id) and (ji.job_spec_id = '10003') and (pm.param_value='21692')) 
order by ji.job_trigger_time desc) 
where rownum<'2' 
10

एलन के जवाब के अलावा, इस भी ठीक काम करता है:

select * 
from (SELECT * 
    FROM student 
    order by age asc, 
      score desc) 
where rownum = 1; 
+0

यह "सभी" परिणामों की शीर्ष पंक्ति देता है। यह प्रश्न शीर्षक से मेल खा सकता है। लेकिन सवाल वास्तव में "प्रत्येक विभाग" की शीर्ष पंक्ति पूछता है। यही कारण है कि यह भारत के उत्तरों से आसान है। –

+0

यह सच है प्रोटॉन, मैं वास्तव में उस भेद को याद करता हूं, और एक सरल सवाल का जवाब देता हूं, जो वास्तव में मैं अपने लिए खोज रहा था जब मैं इस थ्रेड के लिए गुगल गया और पाया। तो मुझे लगता है कि पाठक वास्तव में क्या देख रहा है इसके आधार पर सभी उत्तरों सही और उपयोगी हैं। मेरे उद्देश्य के लिए, एलन का जवाब सबसे उपयोगी था, और फिर मैंने इसे परिष्कृत किया और दोबारा पोस्ट किया। आपके उद्देश्य के लिए, भारत का जवाब सबसे उपयोगी है। हर कोई जीतता है! (हालांकि, मैंने देखा है कि एलन ने आपके संकेत के कारण अपना जवाब संपादित किया है, लेकिन मैं अपनी तरह से छोड़ दूंगा, क्योंकि यह कई लोगों के लिए एक सही जवाब है)। – SurfingSanta

संबंधित मुद्दे