PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

खंड द्वारा समूह के भीतर सरणियों में शामिल होना

UNION ALL

आप UNION ALL . के साथ "काउंटर-पिवट" कर सकते हैं पहला:

SELECT name, array_agg(c) AS c_arr
FROM  (
   SELECT name, id, 1 AS rnk, col1 AS c FROM tbl
   UNION ALL
   SELECT name, id, 2, col2 FROM tbl
   ORDER  BY name, id, rnk
   ) sub
GROUP  BY 1;

आपके द्वारा बाद में अनुरोध किए गए मानों के क्रम को तैयार करने के लिए अनुकूलित। मैनुअल:

बोल्ड जोर मेरा।

LATERAL सबक्वेरी VALUES . के साथ अभिव्यक्ति

LATERAL आवश्यकता है 9.3 पोस्ट करें या बाद में।

SELECT t.name, array_agg(c) AS c_arr
FROM  (SELECT * FROM tbl ORDER BY name, id) t
CROSS  JOIN LATERAL (VALUES (t.col1), (t.col2)) v(c)
GROUP  BY 1;

वही परिणाम। टेबल के ऊपर से केवल एक ही पास की जरूरत है।

कस्टम समग्र कार्य

या आप इन संबंधित उत्तरों में चर्चा की तरह एक कस्टम समग्र कार्य बना सकते हैं:

CREATE AGGREGATE array_agg_mult (anyarray)  (
    SFUNC     = array_cat
  , STYPE     = anyarray
  , INITCOND  = '{}'
);

तब आप कर सकते हैं:

SELECT name, array_agg_mult(ARRAY[col1, col2] ORDER BY id) AS c_arr
FROM   tbl
GROUP  BY 1
ORDER  BY 1;

या, आमतौर पर तेज़, जबकि मानक SQL नहीं:

SELECT name, array_agg_mult(ARRAY[col1, col2]) AS c_arr
FROM  (SELECT * FROM tbl ORDER BY name, id) t
GROUP  BY 1;

जोड़ा गया ORDER BY id (जिसे ऐसे समग्र कार्यों में जोड़ा जा सकता है) आपके वांछित परिणाम की गारंटी देता है:

a | {1,2,3,4}
b | {5,6,7,8}

या इस विकल्प में आपकी रुचि हो सकती है:

SELECT name, array_agg_mult(ARRAY[ARRAY[col1, col2]] ORDER BY id) AS c_arr
FROM   tbl
GROUP  BY 1
ORDER  BY 1;

जो दो-आयामी सरणियाँ उत्पन्न करता है:

a | {{1,2},{3,4}}
b | {{5,6},{7,8}}

पिछले वाले को बिल्ट-इन array_agg() से बदला जा सकता है (और होना चाहिए, जैसा कि यह तेज़ है!) पोस्टग्रेज 9.5 . में या बाद में - सरणियों को एकत्रित करने की अपनी अतिरिक्त क्षमता के साथ:

SELECT name, array_agg(ARRAY[col1, col2] ORDER BY id) AS c_arr
FROM   tbl
GROUP  BY 1
ORDER  BY 1;

वही परिणाम। मैनुअल:

तो बिल्कुल हमारे कस्टम एग्रीगेट फ़ंक्शन array_agg_mult() . के समान नहीं है;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. आप पोस्टग्रेज / पोस्टग्रेएसक्यूएल टेबल और उसके इंडेक्स के डिस्क आकार को कैसे ढूंढते हैं?

  2. संघर्ष पर 9.5 पोस्टग्रेज करें चयन करें

  3. क्या PostgreSQL में PL/pgSQL और SQL दोनों ही SQL/PSM मानक के समान स्तर पर हैं, बजाय केवल SQL मानक के?

  4. Oracle में प्रत्येक पंक्ति के लिए महीनों की श्रृंखला उत्पन्न करें

  5. JDBC के माध्यम से Postgresql 8.4 पर कोई पासवर्ड सेट किए बिना उपयोगकर्ता के रूप में कनेक्ट करें