2009-02-10 11 views
29

पर एसक्यूएल के साथ एक सरणी में जुटना एकाधिक पंक्तियों मैं एक मेज इस तरह का निर्माण किया है:PostgreSQL

oid | identifier | value 
1 | 10   | 101 
2 | 10   | 102 
3 | 20   | 201 
4 | 20   | 202 
5 | 20   | 203 

मैं इस तालिका क्वेरी करने के लिए इस तरह एक परिणाम प्राप्त करना चाहते हैं:

identifier | values[] 
10   | {101, 102} 
20   | {201, 202, 203} 

मैं ऐसा करने का कोई तरीका नहीं समझ सकता। क्या यह संभव है ? कैसे ?

बहुत बहुत धन्यवाद।

+0

यहाँ देखें: http://stackoverflow.com/questions/43870/how-to-concatenate-strings-of-a-string-field-in-a-postgresql-group-by-query – Quassnoi

उत्तर

52

यह एक postgres में निर्मित कुछ संस्करणों के बाद से तो आप अब अपने खुद परिभाषित करने की जरूरत है, नाम array_agg है()।

test=> select array_agg(n) from generate_series(1,10) n group by n%2; 
    array_agg 
-------------- 
{1,3,5,7,9} 
{2,4,6,8,10} 

(यह पोस्ट 8.4.8 है)।

ध्यान दें कि कोई ऑर्डर बी निर्दिष्ट नहीं है, इसलिए परिणाम पंक्तियों का क्रम उपयोग की जाने वाली समूहीकरण विधि (यहां, हैश) पर निर्भर करता है यानी, यह परिभाषित नहीं किया गया है। उदाहरण:

test=> select n%2, array_agg(n) from generate_series(1,10) n group by (n%2); 
?column? | array_agg 
----------+-------------- 
     1 | {1,3,5,7,9} 
     0 | {2,4,6,8,10} 

test=> select (n%2)::TEXT, array_agg(n) from generate_series(1,10) n group by (n%2)::TEXT; 
text | array_agg 
------+-------------- 
0 | {2,4,6,8,10} 
1 | {1,3,5,7,9} 

अब, मैं तुम क्यों {10,2,4,6,8} (हो और {9,7,3,1,5}, generate_series के बाद से पता नहीं है) भेजना चाहिए क्रम में पंक्तियां।

+0

PostgreSQL 8.4.8 में यह रिटर्न: {10,2,4,6,8} और { 9,7,3,1,5}। मुझे लगता है कि उपर्युक्त आउटपुट संस्करण 9 से है। – SabreWolfy

+0

उत्तर संपादित ... – peufeu

+0

मुझे नहीं पता कि पंक्तियों/तत्वों को क्रम में क्यों लौटाया जाता है, जिसे मैं उन्हें देखता हूं। बस कोड कॉपी किया और यह देखने के लिए चिपकाया कि यह क्या किया। – SabreWolfy

16

आपको एक समग्र फ़ंक्शन बनाना है, उदा।

CREATE AGGREGATE array_accum (anyelement) 
(
sfunc = array_append, 
stype = anyarray, 
initcond = '{}' 
); 

तो

SELECT identifier, array_accum(value) AS values FROM table GROUP BY identifier; 

HTH

+0

मैं इस समग्र फ़ंक्शन को बनाने का प्रयास करते समय निम्न त्रुटि प्राप्त करें: त्रुटि: सिंटैक्स त्रुटि या उसके पास "(" – SomethingOn

+0

क्या आप PostgreSQL का उपयोग कर रहे हैं? – SuN

1

अनुरोधित आउटपुट के लिए कोड यहां दिया गया है।

select identifier, array_agg(value) 
from (
    values 
    (1 , 10   , 101), 
    (2 , 10   , 102), 
    (3 , 20   , 201), 
    (4 , 20   , 202), 
    (5 , 20   , 203) 
) as tab (oid, identifier, value) 
group by identifier 
order by identifier;