2012-05-22 15 views
5

कहना है कि मैं कुछ SELECT बयान है लगता है मैंने जो दिखाया है उससे कहीं अधिक जटिल (संभवतः एक दर्जन कॉलम पर काम कर रहा है)।ढूँढें पंक्ति संख्या, तो अपने पड़ोसियों

मैं यूआई में उन्हें प्रदर्शित करने के लिए पंक्तियों का केवल एक छोटा सबसेट (पंक्तियों 1..11 कहता हूं) पुनर्प्राप्त करता हूं। अब, मैं निम्नलिखित समस्याओं को हल करना चाहता हूं:

  1. किसी दिए गए id के साथ एक पंक्ति की संख्या खोजें।
  2. दिए गए 5 आइटम पहले और 5 आइटम आइटम को दिए गए id के साथ प्रदर्शित करें।

समस्या 2 हल करने के लिए एक बार मैं इस समस्या 1 समाधान कर लिया है, जैसा कि मैंने तो अगर मुझे पता है कि आइटम मैं खोज रहा था क्रमबद्ध परिणाम सेट में पंक्ति संख्या 1000 (यह है कुछ इस तरह उपयोग कर सकते हैं आसान है Firebird एसक्यूएल बोली):

SELECT id, name FROM people 
    ORDER BY name ASC 
    ROWS 995 TO 1005; 

मैं भी है कि मैं पंक्तियों जो एक मैं देख रहा हूँ से पहले आने के सभी गणना के द्वारा एक पंक्ति के rank पा सकते हैं पता है, लेकिन इस के साथ बहुत लंबे WHERE खंड को जन्म दे सकता इस स्थिति में OR और AND के टन। और मुझे इसे बार-बार करना है। मेरे परीक्षण डेटा के साथ, यह ठीक से अनुक्रमित कॉलम का उपयोग करते समय भी सैकड़ों मिलीसेकंड लेता है, जो कि बहुत धीमा है।

क्या कुछ SQL: 2003 सुविधाओं (जैसे row_number फ़ायरबर्ड 3.0 में समर्थित) का उपयोग कर इसे प्राप्त करने के कुछ साधन हैं? मैं किसी भी तरह से एक एसक्यूएल गुरु नहीं हूं और मुझे यहां कुछ पॉइंटर्स चाहिए। क्या मैं एक कैश किए गए दृश्य को बना सकता हूं जहां परिणाम रैंक/घने रैंक/पंक्ति अनुक्रमणिका शामिल होगा?

+0

यूआई प्रकार के बारे में जानकारी के बिना जवाब देने में बहुत मुश्किल है। वेब? डेस्कटॉप? कमांड लाइन? वॉयस यूआई ;-) – rstrelba

+0

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

+0

व्यूपोर्ट के फ़िल्टर में कितने अतिरिक्त पैरामीटर? – rstrelba

उत्तर

3

फायरबर्ड विंडो कार्यों का समर्थन करता है (ओरेकल में विश्लेषणात्मक कार्यों कहा जाता है)। तो आप निम्न कर सकते हैं:

select id, row_number() over (partition by NULL order by name, id) 
from t 
where id = <id> 

इसमें यह माना जाता आईडी के खास हैं:

"पंक्ति" एक दिया आईडी के साथ एक एक पंक्ति की संख्या को खोजने के लिए।

दूसरी समस्या को हल करने के लिए:

select t.* 
from (select id, row_number() over (partition by NULL order by name, id) as rownum 
     from t 
    ) t join 
    (select id, row_number() over (partition by NULL order by name, id) as rownum 
     from t 
     where id = <id> 
    ) tid 
    on t.rownum between tid.rownum - 5 and tid.rownum + 5 

मैं कुछ और सुझाव दे सकता है, हालांकि, आप तालिका संरचना को संशोधित कर सकते हैं। अधिकांश डेटाबेस एक पंक्ति डालने पर ऑटो-वृद्धि कॉलम जोड़ने की क्षमता प्रदान करते हैं। यदि आपके रिकॉर्ड कभी नहीं हटाए जाते हैं, तो यह आपके काउंटर के रूप में सर्वर कर सकता है, जो आपके प्रश्नों को सरल बना सकता है।

+0

आपके सुझाव के लिए धन्यवाद। मैं आपके पहले समाधान में जो सुझाव देता हूं उसके आधार पर कुछ उम्मीद कर रहा था। और हाँ, मेरे 'आईडी' कॉलम में अद्वितीय मान हैं। –

+0

मुझे समझ में नहीं आता कि टेबल संरचना को संशोधित करके आपका क्या मतलब है; मूल रूप से, 'आईडी' पहले से ही एक ऑटो-वृद्धि कॉलम है। समस्या यह है कि पंक्तियों का क्रम 'SELECT' कथन में ऑर्डरिंग पर निर्भर करता है। एक अतिरिक्त कॉलम मेरी मदद कैसे कर सकता है? क्या मैं कुछ भुल गया? –

+0

यदि आप तालिका से पंक्तियां नहीं हटाते हैं, तो आप " - 5 और + 5" के बीच आईडी कहां उपयोग कर सकते हैं। यह row_number() गणना को खत्म कर देगा। दूसरे शब्दों में, आपकी समस्या का समाधान सिर्फ एक स्वयं शामिल होगा। –

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