मेरे पास एक तालिका है जिसमें पूर्णांक सरणियों के क्रमपरिवर्तन / संयोजन के दो कॉलम और एक तीसरा कॉलम है, जिसमें मान है:
CREATE TABLE foo
(
perm integer[] NOT NULL,
combo integer[] NOT NULL,
value numeric NOT NULL DEFAULT 0
);
INSERT INTO foo
VALUES
( '{3,1,2}', '{1,2,3}', '1.1400' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0.9280' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,1,2}', '{1,2,3}', '1.2680' ),
( '{3,1,2}', '{1,2,3}', '0' ),
( '{3,2,1}', '{1,2,3}', '0' ),
( '{3,2,1}', '{1,2,3}', '0.8000' )
मैं प्रत्येक क्रमपरिवर्तन के लिए औसत और मानक विचलन का पता लगाना चाहता हूं, साथ ही प्रत्येक संयोजन के लिए भी। मैं इस प्रश्न के साथ कर सकता हूं:
SELECT
f1.perm,
f2.combo,
f1.perm_average_value,
f2.combo_average_value,
f1.perm_stddev,
f2.combo_stddev,
f1.perm_count,
f2.combo_count
FROM
(
SELECT
perm,
combo,
avg( value ) AS perm_average_value,
stddev_pop( value ) AS perm_stddev,
count( * ) AS perm_count
FROM foo
GROUP BY perm, combo
) AS f1
JOIN
(
SELECT
combo,
avg( value ) AS combo_average_value,
stddev_pop( value ) AS combo_stddev,
count( * ) AS combo_count
FROM foo
GROUP BY combo
) AS f2 ON ( f1.combo = f2.combo );
हालांकि, जब मेरे पास बहुत अधिक डेटा होता है, तो यह क्वेरी बहुत धीमी हो सकती है, क्योंकि "फू" तालिका (जो वास्तव में, लगभग 4 मिलियन पंक्तियों के साथ 14 विभाजन होते हैं) को दो बार स्कैन करने की आवश्यकता होती है।
हाल ही में, मुझे पता चला कि पोस्टग्रैज "विंडो फंक्शंस" का समर्थन करता है, जो मूल रूप से एक विशेष कॉलम के लिए ग्रुप बीवाई की तरह है। मैंने अपनी क्वेरी को इन जैसे उपयोग करने के लिए संशोधित किया:
SELECT
perm,
combo,
avg( value ) as perm_average_value,
avg( avg( value ) ) over w_combo AS combo_average_value,
stddev_pop( value ) as perm_stddev,
stddev_pop( avg( value ) ) over w_combo as combo_stddev,
count( * ) as perm_count,
sum( count( * ) ) over w_combo AS combo_count
FROM foo
GROUP BY perm, combo
WINDOW w_combo AS ( PARTITION BY combo );
हालांकि यह "कॉम्बो_काउंट" कॉलम के लिए काम करता है, "कॉम्बो_आवर्स_वेल्यू" और "कॉम्बो_स्टीडदेव" कॉलम अब सटीक नहीं हैं। ऐसा प्रतीत होता है कि प्रत्येक क्रमपरिवर्तन के लिए औसत लिया जा रहा है, और फिर प्रत्येक संयोजन के लिए दूसरी बार औसत किया जा रहा है, जो गलत है।
मैं इसे कैसे ठीक करूं? क्या विंडो फ़ंक्शंस का उपयोग यहां अनुकूलन के रूप में भी किया जा सकता है?