2014-11-28 5 views
5

DB2 डेटाबेस में क्लॉज में ROW_NUMBER() का उपयोग कैसे करें। मैं नीचे की कोशिश की है, लेकिन यह काम नहीं किया: समेकित फ़ंक्शन या OLAP समारोह का अमान्य उपयोग:RB_NUMBER() DB2

SELECT * FROM CSPAPP.LOCATIONS 
WHERE (ROW_NUMBER() OVER(ORDER BY LOCATION)) BETWEEN 100 AND 200 

यह त्रुटि दे दी है।

मैं भी followiong तरीके के साथ करने की कोशिश की:

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,* FROM CSPAPP.LOCATIONS 
WHERE RN < 200 

SELECT (ROW_NUMBER() OVER(ORDER BY LOCATION)) AS RN ,LOCATION FROM CSPAPP.LOCATIONS 
WHERE RN < 200 

उत्तर

4

आप एक ही स्तर जहां यह परिभाषित किया गया है पर एक उपनाम संदर्भ नहीं दे सकता। जब iSeries डीबी 2 में पंक्ति संख्या के आधार पर चयन

SELECT location 
FROM (
    SELECT row_number() over(order by location) as rn, 
      location 
    FROM cspapp.locations 
) 
WHERE rn < 200 
+0

धन्यवाद अपने समाधान के लिए एक बहुत है, लेकिन यह आंशिक रूप से मेरी prupose में सेवारत है। मैं (आर एन के रूप में (स्थान के आधार पर आदेश) पर चयन ROW_NUMBER(), * cspapp.locations से ) कोशिश कर रहा हूँ चुनें * से कहां आर एन <200 लेकिन यह working.Can नहीं है आप सुझाव देते हैं। – Mandar

+0

"* काम नहीं कर रहा * * वैध डीबी 2 त्रुटि संदेश नहीं है। –

+0

ओह.माफ करना। त्रुटि थी: "अप्रत्याशित टोकन * स्थान के आधार पर 'पाया गया था) आरएन के रूप में। अपेक्षित टोकन में निम्न शामिल हो सकते हैं: ।" मैं प्रत्येक कॉलम में प्रवेश नहीं कर सकता क्योंकि तालिका में लगभग 600 कॉलम हैं। इसलिए मुझे एक ही समय में सभी कॉलम चुनने के लिए * का उपयोग करना होगा। – Mandar

3

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

SELECT * 
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, * 
    FROM CSPAPP.LOCATIONS 
    ) 
WHERE RRN between 100 and 200 

आप केवल 1 क्षेत्र आप कर सकते हैं में रुचि रखते हैं चयन को नाम निर्दिष्ट और खेतों को संदर्भित करने में सक्षम हो:

SELECT DATA.location 
FROM (
    SELECT ROW_NUMBER() OVER(ORDER BY location) as RRN, * 
    FROM CSPAPP.LOCATIONS 
    ) as DATA 
WHERE DATA.RRN between 100 and 200 
+0

आपकी मदद के लिए धन्यवाद। मैंने इस तरह कुछ करने की कोशिश की: चयन करें * cspapp.locations से चुनें जहां LOCATION (से स्थान चुनें (पंक्ति के रूप में row_number() को चुनें (स्थान के आधार पर) rno के रूप में, cspapp.locations से LOCATION) जहां 1000 और 10000 के बीच रोनो)। यह काम करता है। – Mandar

-1

आप एक ही स्तर जहां यह परिभाषित किया गया है पर एक उपनाम संदर्भित कर सकते हैं। आप एक व्युत्पन्न तालिका में इस रैप करने के लिए की जरूरत है:

SELECT T1.* FROM(
     SELECT row_number() over(order by location) as rn ,L.* 
     FROM cspapp.locations L) As T1 
WHERE T1.rn < 200 

लेकिन आप * समझना चाहिए एक सबसे अच्छा अभ्यास कभी नहीं किया गया है। आपको * (L.col1) के बजाय कॉलम नाम का उपयोग करना चाहिए।

0

आप row_number की बजाय केवल पहले 200 पंक्तियों को देखने का प्रयास कर सकते हैं। अपने चयन को लिखें जैसा कि आप आमतौर पर ROW_NUMBER के बिना करेंगे, जो कुछ भी आपको चाहिए और पहले x को भेजें।

"*" के साथ सभी कॉलम का चयन करना अच्छा अभ्यास नहीं है विशेष रूप से यदि आपके पास 600+ कॉलम हैं (और यह स्वयं डेटाबेस का खराब डिज़ाइन है)।

0

ROW_NUMBER() फ़ंक्शन का उपयोग कर के बिना:

SELECT * FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATION FETCH FIRST 200 rows only) 
ORDER BY LOCATION DESC FETCH FIRST 100 rows only; 

With Row number: 

SELECT ROW_NUMBER() OVER(ORDER BY LOCATIONS), LOCATIONS as RNM FROM 
(SELECT * FROM CSPAPP.LOCATIONS ORDER BY LOCATIONS FETCH FIRST 200 rows only) 
ORDER BY LOCATIONS DESC FETCH FIRST 100 rows only; 
संबंधित मुद्दे