সঠিক ফলাফল?
প্রথম বন্ধ: সঠিকতা। আপনি অনন্য উপাদানের একটি অ্যারে উত্পাদন করতে চান? আপনার বর্তমান ক্যোয়ারী এটি করে না। ইনটারে মডিউলuniq()
থেকে ফাংশনটি কেবল প্রতিশ্রুতি দেয়:
সংলগ্ন সদৃশগুলি মুছে ফেলুন
ম্যানুয়ালটিতে নির্দেশিত মত , আপনার প্রয়োজন হবে:
SELECT l.d + r.d, uniq(sort(array_agg_mult(r.arr)))
FROM ...
আপনাকে সাজানো অ্যারেও দেয় - ধরে নিলেন যে আপনি এটি চান, আপনি স্পষ্ট করেননি।
আমি দেখতে পাচ্ছি যে আপনার ফ্রিডলটি আপনার কাছে sort()
রয়েছে তাই এটি আপনার প্রশ্নের মধ্যে একটি টাইপও হতে পারে।
পোস্টগ্রাগেস 9.5
উভয় ক্ষেত্রেই, আপনি হবে ভালবাসেন নতুন Postgres 9.5 (বর্তমানে বিটা)। এটি array_agg_mult()
বাক্সের বাইরে চলে যাওয়ার ক্ষমতা এবং আরও দ্রুত সরবরাহ করে:
অ্যারে হ্যান্ডলিংয়ের জন্য অন্যান্য কার্যকারিতা উন্নতিও হয়েছে।
প্রশ্ন
এর মূল উদ্দেশ্য array_agg_mult()
হ'ল বহু-মাত্রিক অ্যারেগুলি একত্রিত করা, তবে আপনি কেবল যাইহোক 1-মাত্রিক অ্যারে উত্পাদন করেন। সুতরাং আমি অন্তত এই বিকল্প কোয়েরি চেষ্টা করব:
SELECT l.d + r.d AS d_sum, array_agg(DISTINCT elem) AS result_arr
FROM left2 l
JOIN right2 r USING (t1)
, unnest(r.arr) elem
GROUP BY 1
ORDER BY 1;
যা আপনার প্রশ্নকেও সম্বোধন করে:
সামগ্রিক ফাংশন ডুপ্লিকেটগুলি সরাসরি মুছে ফেলতে পারে?
হ্যাঁ, এটি পারে DISTINCT
। তবে এটি uniq()
পূর্ণসংখ্যার অ্যারেগুলির চেয়ে দ্রুততর নয় , যা পূর্ণসংখ্যার অ্যারেগুলির জন্য অনুকূলিত করা হয়েছে, যখন DISTINCT
সমস্ত যোগ্যতার ডেটা ধরণের ক্ষেত্রে জেনেরিক।
intarray
মডিউলটির প্রয়োজন নেই । তবে ফলাফলটি বাছাই করা অগত্যা নয়। পোস্টগ্র্রেস DISTINCT
(আইআইআরসি) এর জন্য পৃথক পৃথক অ্যালগরিদম ব্যবহার করে , বড় সেটগুলি সাধারণত হ্যাশ করা হয়, তবে আপনি স্পষ্টভাবে যুক্ত না করলে ফলাফল বাছাই করা হয় না ORDER BY
। আপনার যদি সাজানোর অ্যারে দরকার হয় তবে আপনি সরাসরি সামগ্রিক ক্রিয়ায় যুক্ত করতে পারেন ORDER BY
:
array_agg(DISTINCT elem ORDER BY elem)
তবে এটি প্রাক-সাজানো ডেটাগুলিকে খাওয়ানোর চেয়ে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে ধীরে বেড়ে যায়array_agg()
one সুতরাং আমি একটি subquery বাছাই এবং তারপর সমষ্টি:
SELECT d_sum, uniq(array_agg(elem)) AS result_arr
FROM (
SELECT l.d + r.d AS d_sum, elem
FROM left2 l
JOIN right2 r USING (t1)
, unnest(r.arr) elem
ORDER BY 1, 2
) sub
GROUP BY 1
ORDER BY 1;
এটি পোস্টগ্রিস 9.4-এ আমার কার্সারি পরীক্ষার সবচেয়ে দ্রুততম বৈকল্পিক ছিল।
আপনি যে সরবরাহ করেছেন তার উপর ভিত্তি করে এসকিউএল ফিডল ।
সূচক
আমি এখানে কোনও সূচকের পক্ষে খুব বেশি সম্ভাবনা দেখছি না। একমাত্র বিকল্প হবে:
CREATE INDEX ON right2 (t1, arr);
কেবলমাত্র যদি আপনি এর বাইরে সূচি-কেবল স্ক্যানগুলি পান তবেই তা বোঝা যায় - যা যদি অন্তর্নিহিত টেবিলটি right2
কেবলমাত্র এই দুটি কলামের চেয়ে আরও বিস্তৃত হয় এবং আপনার সেটআপ কেবলমাত্র সূচি-স্ক্যানের জন্য যোগ্যতা অর্জন করে । পোস্টগ্রিস উইকিতে বিশদ।
right2.arr
আপনার ডেমো স্কিমার পরামর্শ মতো নুল কি হতে পারে? ফলস্বরূপ আপনার কি সাজানো অ্যারে দরকার?