2012-03-09 23 views
9

मैं एसक्यूएल सर्वर में इस कुछ इसी तरह की तलाश में हूँ:पोस्टग्रेएसक्यूएल टॉप एन के साथ शीर्ष एन के लिए समकक्ष: LIMIT "संबंधों के साथ"?

SELECT TOP n WITH TIES FROM tablename 

मैं PostgreSQL में के बारे में LIMIT पता है, लेकिन इसके बाद के संस्करण अस्तित्व के बराबर होता है? मैं सिर्फ उत्सुक हूं क्योंकि यह मेरे लिए हर बार एक अतिरिक्त क्वेरी बचाएगा।

यदि मेरे पास nums: {10, 9, 8, 8, 2} विशेषता के साथ तालिका Numbers है।

SELECT nums FROM Numbers ORDER BY nums DESC LIMIT *with ties* 3 

यह {10, 9, 8, 8} लौटना चाहिए क्योंकि यह शीर्ष 3 प्लस अतिरिक्त 8 लेता है के बाद से यह एक दूसरे को बांध: मैं की तरह कुछ करना चाहते हैं।

उत्तर

8

PostgreSQL में SQL Server में कोई WITH TIES खंड नहीं है।
PostgreSQL में मैं TOP n WITH TIES .. ORDER BY <something> के लिए इस विकल्प होगा:

WITH cte AS (
    SELECT *, rank() OVER (ORDER BY <something>) AS rnk 
    FROM tbl 
    ) 
SELECT * 
FROM cte 
WHERE rnk <= n; 

स्पष्ट है कि, rank() सही है, dense_rank() गलत होगा (बहुत अधिक पंक्तियों को वापस)।
(लिंक से ऊपर) एसक्यूएल सर्वर डॉक्स से इस बोली पर विचार करें:

उदाहरण के लिए, अगर अभिव्यक्ति 5 लेकिन 2 अतिरिक्त पंक्तियों के लिए सेट है पंक्ति 5 में स्तंभों के आधार पर आदेश की मान से मेल, परिणाम सेट में 7 पंक्तियां होंगी।

WITH TIES का काम के रूप में ORDER BY खंड द्वारा परिभाषित शीर्ष n में अंतिम पंक्ति के सभी साथियों को शामिल करने के लिए है। rank() सटीक एक ही परिणाम देता है।

यह सुनिश्चित करने के लिए, मैंने SQL सर्वर के साथ परीक्षण किया है, यहां एक live demo है।
और यहां एक और सुविधाजनक SQLfiddle है।

+1

क्यों इस जटिल? रैंक() फ़ंक्शन बिल्कुल वही करेगा जो आवश्यक है? –

+0

@a_horse_with_no_name: आप बिल्कुल सही हैं (जैसा कि मैंने पहले किया था) मेरे दूसरे विचारों के लिए अनिश्चित थे। –

+0

@Ewin: यह अच्छा है (http://data.stackexchange.com/stackoverflow/query/63525/top-n-with-ties), मुझे नहीं पता था कि स्टैकओवरफ्लो में अंतर्निहित मॉड्यूल है क्वेरी चलाने के लिए :-) हालांकि यदि आपको शीर्ष 3 (10, 9 8) प्राप्त करने की आवश्यकता है और उन सभी 10,9,8 को सूचीबद्ध करने की आवश्यकता है, तो 10, 10, 9, 10, 10, 10, 9, 8, 10, 10, 10, 9, 10, 10, जो होना चाहिए: 10,10,9,8,8। किसी दिए गए समस्या के मामले के साथ 'TIES' के साथ गलत हो सकता है: http://stackoverflow.com/questions/2611822/distinct-with-count-and-sql-server-2005/2612456#2612456 –

2

इस प्रयास करें:

आउटपुट: 10, 9, 8, 8

with numbers (nums) as (
  values (10), (9), (8), (8), (2) 
)  
SELECT nums FROM Numbers  
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3) 
ORDER BY nums DESC 

आउटपुट: 10,10,9,8,8

with numbers (nums) as (
    values (10), (9), (8), (8), (2), (10) 
) 
SELECT nums FROM Numbers 
WHERE nums in (SELECT DISTINCT nums FROM Numbers ORDER BY nums DESC LIMIT 3) 
ORDER BY nums DESC