Postgresql में शीर्ष 10 मान कैसे प्राप्त करें?


256

मेरा सरल प्रश्न है:

मेरे पास एक postgresqlडेटाबेस है Scores(score integer):।

मैं सबसे तेज 10 अंक कैसे प्राप्त करूंगा?

अपडेट करें:

मैं इस क्वेरी को कई बार करूंगा और सबसे तेज समाधान के लिए लक्ष्य बना रहा हूं।


6
-1: आपने अब तक क्या किया है? क्यों यह काफी अच्छा नहीं है? पोस्टग्रेज संस्करण क्या है? कहाँ है explain analyze?
माय डेस

जवाबों:


372

इसके लिए आप लिमिट का इस्तेमाल कर सकते हैं

select *
from scores
order by score desc
limit 10

यदि प्रदर्शन महत्वपूर्ण है (यह नहीं है;; स्कोर पर एक सूचकांक के लिए देखो।


संस्करण 8.4 से शुरू होकर, आप मानक का उपयोग भी कर सकते हैं ( SQL: 2008 )fetch first

select *
from scores
order by score desc
fetch first 10 rows only

जैसा कि @Raphvanns ने बताया, यह आपको first 10 rowsशाब्दिक रूप से देगा। डुप्लिकेट मानों को निकालने के लिए, आपको distinctपंक्तियों का चयन करना होगा , जैसे

select distinct *
from scores
order by score desc
fetch first 10 rows only

एसक्यूएल फिडल


2
fetch first X rows onlyजवाब मैं देख रहा था - दूर भविष्य से धन्यवाद!
डॉट पर मास डॉट नेट

35

लगता है आप सीमा खंड के साथ समाप्त होने के क्रम ORDER BYमें देख रहे हैं :DESC

SELECT
 *
FROM
  scores
ORDER BY score DESC
LIMIT 10

बेशक SELECT *प्रदर्शन को गंभीरता से प्रभावित कर सकता है, इसलिए सावधानी के साथ इसका उपयोग करें।


3

ध्यान दें कि यदि शीर्ष 10 मूल्यों में संबंध हैं, तो आप केवल शीर्ष 10 पंक्तियों को प्राप्त करेंगे, न कि दिए गए उत्तरों के साथ शीर्ष 10 मान । Ex: यदि शीर्ष 5 मान 10, 11, 12, 13, 14, 15 हैं, लेकिन आपके डेटा में 10, 10, 11, 12, 13, 14, 15 हैं, तो आपको केवल 10, 10, 11, 12, 13 प्राप्त होंगे। एक के साथ अपने शीर्ष 5 के रूप में 14LIMIT

यहां एक समाधान है जो 10 से अधिक पंक्तियों को लौटा देगा यदि संबंध हैं लेकिन आपको उन सभी पंक्तियों को मिलेगा जहां some_value_columnतकनीकी रूप से शीर्ष 10 में हैं।

select
  *
from
  (select
     *,
     rank() over (order by some_value_column desc) as my_rank
  from mytable) subquery
where my_rank <= 10

उनके सवाल से तालिका में केवल एक कॉलम है। तो क्यों नहीं "स्कोर डेस लिमिट 10 द्वारा स्कोर ऑर्डर से अलग स्कोर का चयन करें"?
डेरेक

@ डेरेक, अच्छी बात है। हालांकि यह शायद एक वास्तविक दुनिया ऐप में ऐसा नहीं होगा जहां हम आमतौर पर "somethings" के शीर्ष एन की पहचान करना चाहते हैं।
राफवन्स

सच। बस अपने सटीक सवाल पर ध्यान केंद्रित कर रहा हूं। इसके अलावा, मेरे पास आपके जैसे उप-वर्ग में सीमा का उपयोग करने के लिए सौभाग्य है, उदाहरण के लिए "तालिका से * का चयन करें जहां मूल्य (तालिका के मान से भिन्न मान डीएससी सीमा 10 से चुनें)" मुझे लगता है कि यह आपके बराबर है। मुझे यकीन नहीं है कि हमारा कौन सा प्रश्न बेहतर प्रदर्शन करेगा, यह संभवतः टेबल संरचना और अनुक्रमण पर निर्भर करेगा।
डेरेक

रैंक () के बाद एक लापता कीवर्ड OVER है
Tiago Alcobia

2
(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date DESC
LIMIT 10)

UNION ALL

(SELECT <some columns>
FROM mytable
<maybe some joins here>
WHERE <various conditions>
ORDER BY date ASC    
LIMIT 10)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.