Postgresql कुल सरणी


94

हाय मेरे पास दो टेबल है

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

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

क्या इस तरह से परिणाम प्राप्त करना देशी Postgresql का चयन करना संभव है:

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

लेकिन ऐसा नहीं है

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

जवाबों:


161

Array_agg का उपयोग करें: 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

वैसे, अगर आप Postgres 9.1 का उपयोग कर रहे हैं, तो आपको SEL BY to GROUP BY, जैसे कि आप BY 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');

2
ओह माय गॉड आपको सेलेक्ट / ग्रुप के बारे में आपकी टिप्पणी के लिए बहुत बहुत धन्यवाद, यह बहुत ही बढ़िया है! यह वास्तव में कष्टप्रद था!
श्रीब्रेडो

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;

यहाँ संदर्भ


मुझे लगता है कि वह एक pgsql सरणी चाहता है, अल्पविराम से अलग नहीं स्ट्रिंग
ThiefMaster


0

@ मिचेल बुएन ने इसे सही पाया। मुझे वह मिला जो मुझे array_agg का उपयोग करके चाहिए था।

यहाँ केवल एक मूल क्वेरी उदाहरण के मामले में यह किसी की मदद करता है:

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} |


इस पोस्ट ने मुझे SQL और Python Pandas में "Group By" बहुत मदद की । यह मूल रूप से कहता है कि जब संभव हो तो केवल एसक्यूएल का उपयोग करना अधिक सुविधाजनक होता है, लेकिन यह कि पायथन पंडस फ़िल्टरिंग प्रक्रिया में अतिरिक्त कार्यक्षमताओं को प्राप्त करने के लिए उपयोगी हो सकते हैं।

मुझे उम्मीद है यह मदद करेगा

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.