2013-02-18 21 views
8

में एक सरणी कॉलम से एकत्रित विशिष्ट मानों की सरणी मान लीजिए कि हमारे पास कुछ पहचानकर्ता, टाइप इंटीजर [] और कुछ अन्य स्तंभों के साथ एक तालिका है (कम से कम एक, हालांकि अधिक हो सकता है) प्रकार पूर्णांक (या कोई अन्य जिसे सारांशित किया जा सकता है)।पोस्टग्रेस

लक्ष्य "संक्षेप में" कॉलम के प्रत्येक पहचानकर्ता योग और सरणी कॉलम के सभी विशिष्ट तत्वों की एक सरणी के लिए कुल देने का लक्ष्य है।

एकमात्र तरीका जो मैं पा सकता हूं वह सबक्वायरी में सरणी कॉलम पर अनन्य फ़ंक्शन का उपयोग करना और "सारांश" कॉलम को एकत्रित करने वाली किसी अन्य सबक्वायरी से जुड़ना है।

CREATE TEMP TABLE a (id integer, aint integer[], summable_val integer); 
INSERT INTO a VALUES 
(1, array[1,2,3], 5), 
(2, array[2,3,4], 6), 
(3, array[3,4,5], 2), 
(1, array[7,8,9], 19); 

WITH u AS (
SELECT id, unnest(aint) as t FROM a GROUP BY 1,2 
), 
d AS (
SELECT id, array_agg(distinct t) ar FROM u GROUP BY 1), 
v as (
SELECT id, sum(summable_val) AS val 
FROM a GROUP BY 1 
) 
SELECT v.id, v.val, d.ar 
FROM v 
JOIN d 
ON v.id = d.id; 

कोड ऊपर है कि मैं क्या इरादा लेकिन सवाल हम किसी भी बेहतर कर सकते हैं:

एक साधारण उदाहरण इस प्रकार है? इस समाधान का मुख्य दोष यह है कि यह तालिका को दो बार पढ़ता है और एकत्र करता है जो बड़ी तालिकाओं के लिए परेशानी हो सकती है।

सामान्य समस्या का कोई अन्य समाधान सरणी कॉलम का उपयोग करने से बचने और प्रत्येक सरणी सदस्य के लिए "सारांश" कॉलम को एग्रीगेट करना है और फिर array_agg को एकत्रीकरण में उपयोग करना है - लेकिन कम से कम अब मैं इस सरणी तरीके से चिपकना चाहता हूं ।

किसी भी विचार के लिए अग्रिम धन्यवाद।

उत्तर

6

क्वेरी एक छोटा सा तेजी से हो सकता है (मुझे लगता है), लेकिन मैं किसी भी उल्लेखनीय अनुकूलन नहीं देख सकते हैं:

select a.id, sum(summable_val) val, ar 
from 
    (select id, array_agg(distinct t) ar 
     from 
     (select id, unnest(aint) as t from a group by 1,2) u 
    group by 1) x 
    join a on x.id = a.id 
group by 1,3 
संबंधित मुद्दे