2010-08-03 14 views
55

मैं एक पोस्टग्रेएसक्यूएल क्वेरी द्वारा लौटाए गए प्रत्येक रिकॉर्ड के लिए अवलोकन संख्या दिखाना चाहता हूं।PostgreSQL क्वेरी में पंक्ति संख्या कैसे दिखाएं?

मुझे लगता है कि 8.4 विंडोिंग फ़ंक्शन इस क्षमता को निष्पादित कर सकते हैं।

+0

मुझे लगता है कि मुझे अपना खुद का प्रश्न पसंद करना है, इसलिए मैं भविष्य में इस पर वापस आ सकता हूं :) – vol7ron

+24

+1 यह पहला प्रश्न है जिसे मैंने देखा है जिसमें एक व्यक्ति से प्रश्न, उत्तर और संवाद शामिल है । – Xeoncross

+2

:) ज़ीओन, तुमने मुझे हंसी बना दिया। मैं अभी भी थोड़ी देर में इस सवाल पर वापस आ गया हूं। – vol7ron

उत्तर

86
select row_number() over (order by <field> nulls last) as rownum, * 
from  foo_tbl 
order by <field> 

तो आदेश आवश्यक नहीं है, इस सवाल का जवाब भी सरल किया जा सकता है:

select row_number() over(), * -- notice: no fields are needed 
from foo_tbl 
+1

ऐसा प्रतीत होता है कि यदि आप 'over()' करते हैं तो यह हमेशा उस विशेष परिणाम के क्रम में '1 2 3 4 ... '* की तरह क्रमशः रैंकर्स देता है (यदि बाहरी प्रश्न हैं जो परिणामों को पुनर्व्यवस्थित करते हैं, तो राउनम ऑर्डर रेफरी से बाहर निकलें: http://stackoverflow.com/a/4812038/32453, इसलिए उन मामलों में 'ऑर्डर बाय' जोड़ना उपयोगी हो सकता है (या यदि आप पहले उदाहरण के रूप में नल की गणना नहीं करना चाहते हैं)। FWIW। – rogerdpack

+1

यह वास्तव में अच्छा है - हमारे लिए नए लोग, कुछ विच्छेदन कर सकते हैं कि यह कैसे काम करता है? –

+2

@ zthomas.nc यह एक खिड़की का काम है। एक परिचित ग्लास खिड़की के बारे में सोचें। अगर आप चाहते हैं, तो आप उस खिड़की को छोटे पैन में विभाजित कर सकते हैं (फ्रेम), सभी परिणाम अभी भी विशिष्ट हैं, लेकिन फ्रेम में विभाजित हैं। यह विभाजन जिसे विभाजन के रूप में जाना जाता है, जो ऊपर '() 'ऊपर है। यदि आपने इसे कोई शर्त नहीं दी है, पूरी खिड़की के लिए एक फलक होगा। 'विंडो फ़ंक्शंस' अद्वितीय हैं कि वे गणना कर सकते हैं एक पूरे परिणाम सेट के बजाय, एक फ्रेम की पंक्तियों में एनीयन। तो अगर आप सेक्स द्वारा 'row_number' करना चाहते हैं, तो आप लिंग से विभाजन के लिए अपने ओवर का उपयोग कर सकते हैं। – vol7ron

5

संस्करणों के लिए पहले 8.4 करने के लिए:

SELECT count(*) rownum, foo.* 
FROM  datatable foo 
JOIN  datatable bar 
      ON (foo.pk_id < bar.pk_id) 
GROUP BY foo.pk_id, foo.a, foo.b 
ORDER BY rownum 
; 

-- if there isn't a single unique/primary key field, you can concatenate fields 
-- Example: ON (foo.a||foo.b||foo.c < bar.a||bar.b||bar.c) 

आशा इस कोई मदद करता है।

+0

इस विधि को किसी भी SQL मानक अनुपालन डेटाबेस – vol7ron

+0

पर काम करना चाहिए, मुझे लगता है कि यह ध्यान रखना महत्वपूर्ण है कि 'शून्य' मानों को 'शून्य' से जोड़ना चाहिए। इस प्रकार, एक 'coalesce() 'का उपयोग करने की आवश्यकता हो सकती है। – vol7ron

+2

विंडो फ़ंक्शन SQL: 2003 मानक का हिस्सा हैं। –

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