2011-04-04 16 views
26

की तादाद में कैसे PostgreSQL में पंक्ति संख्या प्राप्त करने के लिए जब परिणाम कुछ स्तंभ द्वारा आदेश दिया जाता है?पंक्ति PostgreSQL

उदा

SELECT 30+row_number() AS position, * 
FROM users 
ORDER BY salary DESC 
LIMIT 30 
OFFSET 30 

मैं माना जाता है कि क्वेरी इस तरह सूची वापसी होगी:

SELECT 30+row_number(ORDER BY salary DESC) AS position, * 
FROM users 
ORDER BY salary DESC 
LIMIT 30 
OFFSET 30 

वहाँ है:

position | name | salary 
31  | Joy | 4500 
32  | Katie| 4000 
33  | Frank| 3500 

असल में मैं क्वेरी में ORDER खंड नकल करने यह कार्यात्मक करना है कोड को डुप्लिकेट करने की आवश्यकता के बिना आदेशित और क्रमांकित परिणामों को वापस करने का कोई अन्य तरीका?

मैं इस एप्लिकेशन को अपने आप में कुछ चर incrementing द्वारा हल किया जा सकता है, लेकिन मैं डेटाबेस परत पर ऐसा और एप्लिकेशन पहले से ही गिने परिणामों पर लौटने चाहता हूँ ...

उत्तर

37

नहीं - order by विंडोइंग में समारोह और select बयान के order by खंड कार्यात्मक दो अलग बातें हैं।

इसके अलावा, अपने बयान का उत्पादन: ERROR: window function call requires an OVER clause, तो:

SELECT 30+row_number(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30 

होना चाहिए:

SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * FROM users ORDER BY salary DESC LIMIT 30 OFFSET 30 

नोट तो कोई गारंटी नहीं है कि वे भी एक ही उत्पादन करेगा है अगर वेतन अद्वितीय नहीं हैं कि आदेश। शायद यह बेहतर होगा करने के लिए:

SELECT * 
FROM (SELECT 30+row_number() OVER(ORDER BY salary DESC) AS position, * 
     FROM users) 
ORDER BY position LIMIT 30 OFFSET 30 

यह भी ध्यान रखें कि आप इस क्वेरी अलग ऑफसेट के साथ कई बार चला रहे हैं, आप की जरूरत है कि करने के लिए:

  1. अपने isolation level को serializable
  2. सेट करना जो भी आप ऑर्डर कर रहे हैं वह अद्वितीय है

या आपको डुप्लिकेट और गायब पंक्तियां मिल सकती हैं। क्यों this answer पर टिप्पणियां देखें।

+0

"अलगाव स्तर दोहराने योग्य पढ़ने" सभी कि आवश्यक है है ... लेकिन किसी भी तरह, आप आवेदन के आधार पर ... जो बहुत मुश्किल हो सकता है ऐसा करने के लिए सुनिश्चित करने के लिए कनेक्शन और लेन-देन खुले रहते हैं की जरूरत है,। –