আমার কাছে দুটি কলামের ক্রম / পূর্ণসংখ্যার অ্যারের সংমিশ্রণ এবং একটি তৃতীয় কলামে একটি মান রয়েছে এমন একটি টেবিল রয়েছে:
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 );
এটি "কম্বো_কাউন্ট" কলামের জন্য কাজ করার সময়, "কম্বো_ভেরেজ_ভ্যালু" এবং "কম্বো_স্টেদেব" কলামগুলি আর সঠিক নয়। দেখা যাচ্ছে যে প্রতিটি ক্রম ছাড়ার জন্য গড় নেওয়া হচ্ছে এবং তারপরে প্রতিটি সংমিশ্রনের জন্য দ্বিতীয়বার গড় গড়ে নেওয়া হচ্ছে, যা ভুল।
আমি এটা কিভাবে ঠিক করবো? উইন্ডো ফাংশন এমনকি এখানে একটি অপ্টিমাইজেশন হিসাবে ব্যবহার করা যেতে পারে?