मेरे पास समूहों का एक समूह है। प्रत्येक समूह प्रविष्टि का स्वामित्व किसी अन्य समूह प्रविष्टि के पास होता है। उदाहरण के लिए, soccer club समूह के पास soccer training, soccer cardio squad, pro training और beginner training हैं। मैं यह जानना चाहता हूं कि कौन सा समूह सबसे अधिक training प्रकार समूह का स्वामी है। यह निर्धारित करने के लिए कि कौन सा समूह एक-दूसरे से संबंधित है, मेरे पास groupOwnedBy() नामक एक फ़ंक्शन है जो समूह का मालिक id लौटाता है।

उदाहरण के लिए, अगर हम यह जांचना चाहते हैं कि कौन सा समूह soccer training का मालिक है, तो हम 2 पास करते हैं, क्योंकि वह soccer training

SELECT * FROM groupOwnedBy(2);

समूह की आईडी लौटाएगा, 1, जो soccer training का मालिक है (जिसका अर्थ है कि यह soccer club के स्वामित्व में है)

groupOwnedBy
------------
1

SELECT * from groupOwnedBy(1); -- will return 1. soccer club is owned by soccer club

मैं उस समूह का नाम प्रिंट करना चाहता हूं जिसके पास सबसे अधिक प्रशिक्षण प्रकार के समूह हैं। इस मामले में इसे soccer club प्रिंट करना चाहिए।


CREATE TABLE groups (
  id integer primary key,
  type text NOT NULL,
  name text
);


INSERT INTO groups (id, type, name) VALUES
(1, 'owner', 'soccer club'),          -- owned by soccer club
(2, 'training', 'soccer training'),   -- owned by soccer club
(3, 'cardio', 'soccer cardio squad'), -- owned by soccer club
(4, 'training', 'pro training'),      -- owned by soccer club
(5, 'training', 'beginner training'), -- owned by soccer club
(6, 'cardio', 'Cricket cardio team'), -- owned by cricket club
(7, 'owner', 'Cricket club'),         -- owned by cricket club
(8, 'training', 'Cricket training'),  -- owned by cricket club
(9, 'owner', 'Hockey club'),          -- owned by Hockey club
(10, 'owner', 'Kids Hockey')          -- owned by Hockey club
(11, 'training', 'smart train'),      -- owned by Hockey club
(12, 'training', 'fit train');        -- owned by Hockey club

मैने कोशिश कर ली

SELECT name
FROM group
WHERE type = 'training'
GROUP BY ownedByGroup(id)
ORDER BY COUNT(*) DESC
LIMIT 1;

लेकिन मुझे त्रुटि मिलती रहती है:

ERROR: column "name" must appear in the GROUP BY clause or be used in an aggregate function
1
Kiwa 30 अक्टूबर 2020, 07:27

1 उत्तर

सबसे बढ़िया उत्तर

आप स्वामित्व वाले समूह (आईडी) अभिव्यक्ति द्वारा समूहित करेंगे और अधिकतम गणना (*) प्राप्त करेंगे।

उसके बाद आप समूह तालिका से जुड़ेंगे, ताकि आईडी से संबंधित नाम को निम्न प्रकार से देखा जा सके

select y.name,y.id 
  from (
    SELECT ownedByGroup(id) as max_training_grp_id
          ,count(*)
      FROM group
     WHERE type = 'training'
    GROUP BY ownedByGroup(id)
    ORDER BY COUNT(*) DESC
    LIMIT 1
       )x
   join group y
     on x.max_training_grp_id=y.id
0
George Joseph 30 अक्टूबर 2020, 07:45