2010-11-29 10 views
8

से वाई पंक्तियों के बाद डेटा शीर्ष x डेटा का चयन कैसे करें उदाहरण के लिए मेरे पास एक तालिका है जिसमें 10'000 पंक्तियां हैं। मैं शीर्ष 500 पंक्तियों के बाद शीर्ष 100 पंक्तियों का चयन करना चाहता हूं। मैं इसे सबसे कुशलता से कैसे कर सकता हूं।SQL सर्वर

क्वेरी SQL सर्वर के लिए आवश्यक 2008


उदाहरण के लिए मैं इस प्रश्न के पहले से ही है, लेकिन मैं आश्चर्य वहाँ किसी भी अधिक प्रभावी समाधान कर रहे हैं

SELECT TOP 100 xx 
FROM nn 
WHERE cc NOT IN 
    (SELECT TOP 500 cc 
     FROM nn ORDER BY cc ASC) 
+0

एमएस एसक्यूएल सर्वर का कौन सा संस्करण? – hunter

+0

संस्करण एमएस एसक्यूएल 2008 – MonsterMMORPG

+0

क्या आपका मतलब है कि आप 500-600 पंक्तियों का चयन करना चाहते हैं? या आप चाहते हैं कि परिणाम 500 शीर्ष पंक्तियों को वापस लौटाए, तो शीर्ष 100 पंक्तियां इस पर सम्मिलित होंगी? –

उत्तर

14

Tutorial 25: Efficiently Paging Through Large Amounts of Data

with cte as (
SELECT ..., 
    ROW_NUMBER() OVER (ORDER BY ...) as rn 
FROM ...) 
SELECT ... FROM cte 
WHERE rn BETWEEN 500 and 600; 
+0

क्या हम कह सकते हैं कि यह सबसे प्रभावी तरीका है? – MonsterMMORPG

+1

नहीं। यह अभी भी सबसे अच्छे मामले में है, 500 पंक्तियों को उनकी गणना करने के लिए स्कैन करें ताकि यह पता चल सके कि कब शुरू करना है। बदतर मामले में इसे सभी पंक्तियों को स्कैन करने की आवश्यकता है, उन्हें क्रमबद्ध करें और फिर प्रारंभिक बिंदु तक पहुंचने के लिए 500 क्रमबद्ध पंक्तियों की गणना करें। यदि आप पंक्ति 9500 से 10000 तक पूछते हैं, और फिर 99 99 00 से 1000000 पंक्तियों के लिए कहीं भी बदतर हैं तो चीजें बदतर हो जाती हैं। सबसे प्रभावी तरीका कुंजीसेट संचालित है: 'शीर्ष चुनें (500) ... से ... कहां कुंजी> @ अंतिम पृष्ठ LastKey' , लेकिन इसके लिए क्लाइंट में फैंसी लॉजिक की आवश्यकता है (चाबियों का ट्रैक रखें) और मनमाने ढंग से कॉलम ऑर्डर की अनुमति नहीं देता है। –

+0

मैं देखता हूं। लेकिन फ़िल्टरिंग सुविधाओं के बाद से यह मेरे लिए काफी असंभव है। – MonsterMMORPG

2

चयन टॉप 500, तो टॉप 100 श्रृंखलाबद्ध परिणाम सेट करने के लिए।

आम तौर पर, ऐसा करने के लायक होने के लिए, आपको कुछ मानदंडों की आवश्यकता होती है जिनके लिए 500 रिकॉर्ड की आवश्यकता होती है, और केवल 100 अन्य शर्त के लिए। मुझे लगता है कि शीर्ष 100 के लिए ये शर्तें condition1 हैं, और शीर्ष 100 के लिए condition2 हैं। क्योंकि स्थिति अलग होती है, कि कारण है कि रिकॉर्ड टॉप 100.

select TOP 500 * 
    from MyTable 
    where -- condition1 -- Retrieving the first 500 rows meeting condition1 
union 
    select TOP 100 * 
     from MyTable 
     where -- condition2 -- Retrieving the first 100 rows meeting condition2 
-- The complete result set of the two queries will be combined (UNIONed) into only one result set. 

संपादित करें # 1

इस मैं क्या मतलब नहीं है के आधार पर ही नहीं हो सकता है। मैं शीर्ष 500 पंक्तियों के बाद आने वाली शीर्ष 100 पंक्तियों का चयन करना चाहता हूं। तो पंक्तियों का चयन 501-600

आपकी टिप्पणी के बाद, मैं बेहतर समझ गया कि आप क्या हासिल करना चाहते हैं। इसे आज़माएं:

WITH Results AS (
    select TOP 600 f.*, ROW_NUMBER() OVER (ORDER BY f.[type]) as RowNumber 
     from MyTable f 
) select * 
    from Results 
    where RowNumber between 501 and 600 

क्या इससे मदद मिलती है?

+0

यह मेरा मतलब नहीं था। मैं शीर्ष 500 पंक्तियों के बाद आने वाली शीर्ष 100 पंक्तियों का चयन करना चाहता हूं। तो पंक्तियों का चयन 501-600 – MonsterMMORPG

+0

मैं क्यों चाहता हूं कि यह बहुत आसान है। बस पेजिंग। उदाहरण के लिए आपके पास 1000 रिकॉर्ड हैं। लेकिन प्रति पृष्ठ के लिए आप उपयोगकर्ता 100 दिखाते हैं। मैं एक ही समय में सभी 1000 परिणामों का चयन नहीं करना चाहता हूं। – MonsterMMORPG

+0

फिर आपको एक बड़ा परिणाम सेट चुनने और इसे 'ROW_NUMBER' –

3
SELECT 
    col1, 
    col2 
FROM (
    SELECT ROW_NUMBER() OVER (
     ORDER BY [t0].someColumn) as ROW_NUMBER, 
    col1, 
    col2 
    FROM [dbo].[someTable] AS [t0] 
    ) AS [t1] 
WHERE [t1].[ROW_NUMBER] BETWEEN 501 and 600 
ORDER BY [t1].[ROW_NUMBER] 
+2

अधिक कुशल लगता है। वह आंतरिक चयन कथन बेहद अक्षम है। यह एक आरबीएआर खोज करता है, http://www.simple-talk.com/sql/t-sql-programming/rbar--row-by-agonizing-row/ यदि इसे टाला जा सकता है (अधिकतर बार यह कर सकता है) आंतरिक चयन कभी नहीं करें –

+0

+1 मुझे इसे मारो। –

+0

मैं सवाल पूछता हूं: क्यों? कभी-कभी यह अपरिहार्य है। –

9
Select T0P 600 * 
from my table 
where --whatever condition you want 
except 
select top 500 * 
from mytable 
where --whatever condition you want 
+0

+1 अच्छा! मुझे 'EXCEPT' कथन के बारे में पता नहीं था। –

+0

यह सबसे अच्छा जवाब प्रतीत होता है, सिवाय इसके कि हमें वही स्थिति दो बार देनी होगी। – Thunder