পোস্টগ্রিস্কল GROUP_CONCAT সমতুল্য?


247

আমার একটি টেবিল রয়েছে এবং আমি ক্ষেত্রের মানগুলি সংক্ষিপ্ত করে প্রতি আইডি প্রতি এক সারি টানতে চাই।

আমার টেবিলে, উদাহরণস্বরূপ, আমার কাছে এটি রয়েছে:

TM67 | 4  | 32556
TM67 | 9  | 98200
TM67 | 72 | 22300
TM99 | 2  | 23009
TM99 | 3  | 11200

এবং আমি আউটপুট দিতে চাই:

TM67 | 4,9,72 | 32556,98200,22300
TM99 | 2,3    | 23009,11200

মাইএসকিউএলে আমি সমষ্টিগত ফাংশনটি ব্যবহার করতে সক্ষম হয়েছি GROUP_CONCAT, তবে এখানে এটি কাজ করবে বলে মনে হচ্ছে না ... পোস্টগ্রিসএসকিউএল এর সমতুল্য, বা এটি সম্পাদন করার জন্য অন্য কোনও উপায় আছে কি?





1
আমি মনে করি সবচেয়ে ভালো উত্তর আরেকটি প্রশ্ন এখনও: stackoverflow.com/a/47638417/243233
Jus12

উত্তর:


237

এটি সম্ভবত একটি ভাল সূচনা পয়েন্ট (শুধুমাত্র সংস্করণ 8.4+):

SELECT id_field, array_agg(value_field1), array_agg(value_field2)
FROM data_table
GROUP BY id_field

অ্যারে_অ্যাগ একটি অ্যারে প্রদান করে, তবে আপনি এটি পাঠ্য প্রয়োজন এবং প্রয়োজন অনুসারে সম্পাদনা করতে পারেন (নীচে স্পষ্টতা দেখুন))

সংস্করণ 8.4 এর পূর্বে আপনাকে এটি ব্যবহারের আগে নিজেরাই এটি সংজ্ঞায়িত করতে হবে:

CREATE AGGREGATE array_agg (anyelement)
(
    sfunc = array_append,
    stype = anyarray,
    initcond = '{}'
);

(পোস্টগ্র্যাস এসকিউএল ডকুমেন্টেশন থেকে প্যারাফ্রেসড)

ব্যাখ্যা:

  • পাঠ্যে একটি অ্যারে নিক্ষেপ করার ফলাফলটি হ'ল ফলস্বরূপ স্ট্রিংটি কোঁকড়া ধনুর্বন্ধনী দ্বারা শুরু হয় এবং শেষ হয়। Bra ধনুর্বন্ধনীগুলি কাঙ্ক্ষিত না হলে কোনও পদ্ধতি দ্বারা মুছে ফেলা দরকার।
  • আয়ারআরে টেক্সট এ কাস্ট করা সেরা সিএসভি আউটপুটকে সিমুলেট করে যেমন এম্বেড করা কমা থাকে এমন উপাদানগুলি স্ট্যান্ডার্ড সিএসভি স্টাইলে আউটপুটে ডাবল-কোটেড হয়। উভয়ই অ্যারে_ টু স্ট্রিং () বা স্ট্রিং_এজিজি ("9.1-এ যোগ হওয়া" গ্রুপ_কনক্যাট "ফাংশন) এম্বেড করা কমাগুলি সহ উদ্ধৃতি স্ট্রিংগুলির ফলস্বরূপ ফলাফলের তালিকার একটি ভুল সংখ্যক উপাদানের ফলস্বরূপ।
  • নতুন 9.1 স্ট্রিং_এজি () ফাংশনটি প্রথমে অভ্যন্তরীণ ফলাফলগুলি TEXT এ ফেলেছে না। সুতরাং "স্ট্রিং_এজিগ (মান_ফিল্ড)" যদি ভ্যালু_ফিল্ডটি পূর্ণসংখ্যা হয় তবে একটি ত্রুটি তৈরি করে। "স্ট্রিং_এজিজি (মান_ফিল্ড :: পাঠ্য)" প্রয়োজন হবে। অ্যারে_এগজি () পদ্ধতিতে সমষ্টিগুলির পরে কেবলমাত্র একটি কাস্ট প্রয়োজন (মান অনুসারে কাস্টের চেয়ে)।

1
এবং 9.0 এ আপনার তালিকাগুলি () থাকবে
স্কট বেইলি

6
পেতে যে CSV ক্যোয়ারী হওয়া উচিত: নির্বাচন id_field, array_to_string (array_agg (value_field1), ','), array_to_string (array_agg (value_field2), '') data_table গ্রুপ থেকে id_field বাই
Nux

2
আপনি এখানে সব ক্ষেত্রে অ্যারে_ টু স্ট্রিং ব্যবহার করতে পারবেন না। যদি আপনার মান_ফিল্ডে একটি এমবেডড কমা থাকে তবে ফলাফল প্রাপ্ত সিএসভি ভুল। অ্যারে_এগজি () ব্যবহার করে এবং TEXT এ কাস্টিং যথাযথ এম্বেড করা কমা দিয়ে স্ট্রিংগুলি উদ্ধৃত করে। কেবলমাত্র সতর্কতাই হ'ল এটির মধ্যে শুরু এবং শেষ কোঁকড়া ধনুর্বন্ধনী অন্তর্ভুক্ত, সুতরাং আমার বিবৃতি "এবং প্রয়োজন হিসাবে সম্পাদনা করুন"। আমি বিষয়টি উল্লেখ করতে সম্পাদনা করব।
ম্যাথু উড


255

9.0 যেহেতু এটি আরও সহজ:

SELECT id, 
       string_agg(some_column, ',')
FROM the_table
GROUP BY id

32
নোট করুন যে বাক্য গঠন আপনাকে স্ট্রিংয়ের মানগুলির ক্রম নির্দিষ্ট করতে (বা অ্যারে ব্যবহার করে array_agg) উদাহরণস্বরূপ string_agg(some_column, ',' ORDER BY some_column)বা এমনকিstring_agg(surname || ', ' || forename, '; ' ORDER BY surname, forename)
IMSoP

8
এটা তোলে সন্ত্রস্ত যে distinctstring_agg সঙ্গে কাজ করে, তাই ব্যবহার করতে পারেনstring_agg(distinct some_solumn, ',')
অরুণ

3
মনে রাখবেন যে কলামটির মানটি TEXTযদি স্ট্রিং-অযোগ্য মান (যেমন। uuid) হয় তবে আপনাকে এটি কাস্ট করতে হবে । এটির মতো লাগবেstring_agg(some_column::text, ',')
কেন্ডাল

48
SELECT array_to_string(array(SELECT a FROM b),', ');

পাশাপাশি করবে।


আপনি কি নির্দিষ্ট ক্রমে একত্রিত হয়ে এই মন্তব্যে এমন কিছু করা সম্ভব ? আপনি কীভাবে একটি কলাম দ্বারা দলবদ্ধকরণ এবং অন্য একটি দ্বারা অর্ডার করবেন (উদাহরণস্বরূপ, একটি অনুদৈর্ঘ্য ডেটা সেট মধ্যে ভেরিয়েবল একত্রিত করতে)?
মাইকেল 18

15

এটির মতো চেষ্টা করুন:

select field1, array_to_string(array_agg(field2), ',')
from table1
group by field1;

2

এবং অ্যারে ধরণের কাজ করার জন্য সংস্করণ :

select
  array_to_string(
    array(select distinct unnest(zip_codes) from table),
    ', '
);

সদৃশ জবাব, @ ম্যাক্স_স্পাই পাঁচ বছর আগে একই কথা বলেছিলেন
এমিল ভিকাস্ট্রম

@ এমিলভিক্রাস্টম: আপনার ভুল হওয়ার অধিকার রয়েছে তবে মনোযোগ দিয়ে পড়ুন। এটি কেবল আলাদা নয়, তবে আমি একটি উদাহরণ দিয়েছি, যা অ্যারে টাইপের সাথে কাজ করে - যেমন জিপ_কোডস রয়েছে character varying(5)[]। এছাড়াও, আমি যাচাই করেছি যে আমার উদ্দেশ্যে - অযথা দরকার, অন্যথায় আপনি দেখতে পাবেন ERROR: cannot accumulate arrays of different dimensionality
সাওওমির লেনার্ট

1

পোস্টগ্রেস্কলিতে আমার মামলা

SELECT cpf || ';' || nome || ';' || telefone  
FROM (
      SELECT cpf
            ,nome
            ,STRING_AGG(CONCAT_WS( ';' , DDD_1, TELEFONE_1),';') AS telefone 
      FROM (
            SELECT DISTINCT * 
            FROM temp_bd 
            ORDER BY cpf DESC ) AS y
      GROUP BY 1,2 ) AS x   

1
আপনি কেন ORDER BYএকটি অভ্যন্তরীণ কোয়েরি করছেন ? অর্ডারটি কীভাবে হারাবে না?
mypetlion

-1

আশা করি নীচে ওরাকল ক্যোয়ারী কাজ করবে।

Select First_column,LISTAGG(second_column,',') 
    WITHIN GROUP (ORDER BY second_column) as Sec_column, 
    LISTAGG(third_column,',') 
    WITHIN GROUP (ORDER BY second_column) as thrd_column 
FROM tablename 
GROUP BY first_column

আমি এটি rextester.com/l/postgresql_online_compiler এ পরীক্ষা করেছি এবং কাজ করি নি: 42883: ফাংশন লিস্ট্যাগ (পাঠ্য, অজানা, পাঠ) বিদ্যমান নেই
ম্যানুয়েল রোমিও

ওরাকল পোস্টগ্র্রেসের চেয়ে আলাদা সিনট্যাক্স এবং ফাংশন রয়েছে।
হারমান জে রাদটেক III
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.