পোস্টগ্র্যাসক্লাল সামগ্রিক অ্যারে


96

আমার দুটি টেবিল আছে

Student
--------
Id  Name
1   John    
2   David
3   Will

Grade
---------
Student_id  Mark
1           A
2           B
2           B+
3           C
3           A

নীচের মত ফলাফল পেতে কি দেশীয় পোস্টগ্রিকেল নির্বাচন করা সম্ভব:

Name    Array of marks
-----------------------
'John',     {'A'}
'David',    {'B','B+'}
'Will',     {'C','A'}

তবে নীচের মতো নয়

Name    Mark
----------------
'John',     'A'
'David',    'B'
'David',    'B+'
'Will',     'C'
'Will',     'A'

উত্তর:


166

অ্যারে_আগ: http://www.sqlfiddle.com/#!1/5099e/1 ব্যবহার করুন

SELECT s.name,  array_agg(g.Mark) as marks        
FROM student s
LEFT JOIN Grade g ON g.Student_id = s.Id
GROUP BY s.Id

যাইহোক, আপনি পোস্টগ্রিস ৯.১ ব্যবহার করছেন, আপনার দ্বারা গ্রুপ থেকে গ্রুপে নির্বাচন করতে কলামগুলি পুনরাবৃত্তি করার দরকার নেই , যেমন আপনাকে গ্রুপের মাধ্যমে শিক্ষার্থীর নাম পুনরাবৃত্তি করার দরকার নেই। আপনি কেবল প্রাথমিক কী দ্বারা গ্রুপ করতে পারেন। আপনি যদি শিক্ষার্থীর প্রাথমিক কীটি সরিয়ে ফেলেন তবে আপনাকে GROUP BY এ শিক্ষার্থীর নামটি পুনরাবৃত্তি করতে হবে।

CREATE TABLE grade
    (Student_id int, Mark varchar(2));

INSERT INTO grade
    (Student_id, Mark)
VALUES
    (1, 'A'),
    (2, 'B'),
    (2, 'B+'),
    (3, 'C'),
    (3, 'A');


CREATE TABLE student
    (Id int primary key, Name varchar(5));

INSERT INTO student
    (Id, Name)
VALUES
    (1, 'John'),
    (2, 'David'),
    (3, 'Will');

4
ওহ godশ্বর আপনার বাছাই / দল সম্পর্কে আপনার মন্তব্য সম্পর্কে অনেক ধন্যবাদ, এটি দুর্দান্ত! সত্যিই বিরক্তিকর ছিল!
mrbrdo

8

আমি যা বুঝি আপনি এরকম কিছু করতে পারেন:

SELECT p.p_name, 
    STRING_AGG(Grade.Mark, ',' ORDER BY Grade.Mark) As marks
FROM Student
LEFT JOIN Grade ON Grade.Student_id = Student.Id
GROUP BY Student.Name;

সম্পাদনা

আমি নিশ্চিত না. তবে এরপরেও এরকম কিছু হতে পারে:

SELECT p.p_name, 
    array_to_string(ARRAY_AGG(Grade.Mark),';') As marks
FROM Student
LEFT JOIN Grade ON Grade.Student_id = Student.Id
GROUP BY Student.Name;

এখানে রেফারেন্স


আমি মনে করি তিনি পিএএসকিউএল অ্যারে চান, কমা-বিচ্ছিন্ন স্ট্রিং নয়
থিফমাস্টার


0

@ মিশেল বুয়েন এটি সঠিকভাবে পেয়েছে। অ্যারে_অ্যাগ ব্যবহার করে আমার যা প্রয়োজন তা পেয়েছি।

এখানে কাউকে সহায়তা করার ক্ষেত্রে কেবলমাত্র একটি প্রাথমিক ক্যোয়ারির উদাহরণ:

SELECT directory, ARRAY_AGG(file_name) FROM table WHERE type = 'ZIP' GROUP BY directory;

এবং ফলাফলটি এরকম কিছু ছিল:

parent_directory | array_agg | ------------------------+----------------------------------------+ /home/postgresql/files | {zip_1.zip,zip_2.zip,zip_3.zip} | /home/postgresql/files2 | {file1.zip,file2.zip} |


এই পোস্টটিও আমাকে অনেক সাহায্য করেছিল: এসকিউএল এবং পাইথন পান্ডাসে "গ্রুপ বাই" । এটি মূলত বলেছে যে সম্ভব হলে কেবল এসকিউএল ব্যবহার করা আরও সুবিধাজনক, তবে পাইথন পান্ডস ফিল্টারিংয়ের প্রক্রিয়ায় অতিরিক্ত কার্যকারিতা অর্জনে কার্যকর হতে পারে।

আমি আসা করি এটা সাহায্য করবে

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