2013-04-11 4 views
19

में विभिन्न फ़ील्ड से अधिकतम मान खोजें और संबंधित मान दिखाएं मेरे पास उन शहरों के बारे में डेटा है जिसमें उनके नाम, आबादी और अन्य फ़ील्ड शामिल हैं जो मेरे प्रश्न के लिए अप्रासंगिक हैं।SQL सर्वर

ID  Name Population 
1  A  45667 
2  B  123456 
3  C  3005  
4  D  13769 

अधिकतम आबादी बुनियादी है खोजने के लिए, लेकिन मैं एक और स्तंभ

Population  Name  
123456   B  

मैं के माध्यम से देखा है में एक परिणामस्वरूप तालिका एक स्तंभ में अधिकतम आबादी है कि, और इसी शहर के नाम की जरूरत है similar प्रश्न, लेकिन किसी कारण से उत्तर अधिक जटिल लगते हैं। क्या क्वेरी को 1 या 2 लाइनों में लिखने का कोई तरीका है?

WHERE खंड में एक फिल्टर:

select id, name, population 
from yourtable 
where population in (select max(population) 
        from yourtable) 

या एक सबक्वेरी:

+1

आपके पास एक दी गई (अधिकतम) आबादी वाले एक से अधिक शहर हो सकते हैं। क्या यह आपके लिए एक बहु-रिकॉर्ड परिणाम स्वीकार्य है? – Pino

+0

तालिका अमेरिकी शहरों का वास्तविक विश्व डेटा है, इसलिए कोई डुप्लिकेट नहीं है। – HDunn

+5

मुझे लगता है कि आप मर्फी के कानून को नहीं जानते :-) – Pino

उत्तर

30

ऐसे कई तरीके है कि यह किया जा सकता है

select id, name, population 
from yourtable t1 
inner join 
(
    select max(population) MaxPop 
    from yourtable 
) t2 
    on t1.population = t2.maxpop; 

या आप TOP WITH TIES उपयोग कर सकते हैं। यदि कोई संबंध नहीं हो सकता है, तो आप with ties हटा सकते हैं।

select top 1 with ties id, name, population 
from yourtable 
order by population desc 

आप एसक्यूएल सर्वर का उपयोग कर रहे जब से तुम भी परिणाम प्राप्त करने के रैंकिंग कार्यों का उपयोग कर सकते हैं::

select id, name, population 
from 
(
    select id, name, population, 
    row_number() over(order by population desc) rn 
    from yourtable 
) src 
where rn = 1 

सभी की SQL Fiddle with Demo देखें यह किसी भी पंक्तियों है कि एक ही आबादी मूल्य शामिल होंगे।

रैंकिंग फ़ंक्शन पर एक साइड नोट के रूप में, आप row_number() के बजाय dense_rank() का उपयोग करना चाह सकते हैं। फिर यदि आप एक ही आबादी वाले एक से अधिक शहर हैं तो आपको शहर के नाम दोनों मिलेंगे। (Demo देखें)

+0

पहला उदाहरण काम करता है, धन्यवाद। – HDunn

+3

@HDunn आपका स्वागत है, मैं आपको कई कामकाजी संस्करण दिखाना चाहता था। :) – Taryn

+2

"ऑर्डर द्वारा .... desc limit 1" एक साधारण और अच्छा विचार है, जो कभी-कभी दिमाग में नहीं आ जाता है :) – Dexter