कुछ इस तरह का प्रयास करें:
SELECT id, unnest(array300) as val, ntile(100) OVER (PARTITION BY id) as bucket_num
FROM your_table
यह SELECT
आपको प्रति array300
में 300 रिकॉर्ड देगा एक ही id
. के साथ और उन्हें bucket_num
(1 प्राथमिकी 3 तत्वों के लिए, 2 अगले 3 के लिए, और इसी तरह)।
फिर avg
. प्राप्त करने के लिए इस चयन का उपयोग करें बाल्टी में तत्वों की:
SELECT id, avg(val) as avg_val
FROM (...previous select here...)
GROUP BY id, bucket_num
अगला - बस avg_val
को एकत्रित करें सरणी में:
SELECT id, array_agg(avg_val) as array100
FROM (...previous select here...)
GROUP BY id
विवरण:अननेस्ट , ntile , array_agg , ओवर (पार्टिशन बाय )
UPD:इस फ़ंक्शन को आज़माएं:
CREATE OR REPLACE FUNCTION public.array300_to_100 (
p_array300 numeric []
)
RETURNS numeric [] AS
$body$
DECLARE
dim_start int = array_length(p_array300, 1); --size of input array
dim_end int = 100; -- size of output array
dim_step int = dim_start / dim_end; --avg batch size
tmp_sum NUMERIC; --sum of the batch
result_array NUMERIC[100]; -- resulting array
BEGIN
FOR i IN 1..dim_end LOOP --from 1 to 100.
tmp_sum = 0;
FOR j IN (1+(i-1)*dim_step)..i*dim_step LOOP --from 1 to 3, 4 to 6, ...
tmp_sum = tmp_sum + p_array300[j];
END LOOP;
result_array[i] = tmp_sum / dim_step;
END LOOP;
RETURN result_array;
END;
$body$
LANGUAGE 'plpgsql'
IMMUTABLE
RETURNS NULL ON NULL INPUT;
इसमें एक array300
लगता है और एक array100
. को आउटपुट करता है . इसका उपयोग करने के लिए:
SELECT id, array300_to_100(array300)
FROM table1;
अगर आपको इसे समझने में कोई समस्या है - बस मुझसे पूछें।