PostgreSQL
 sql >> डेटाबेस >  >> RDS >> PostgreSQL

एक बहुत ही सरल QUERY पर HAVING को WHERE के साथ संयोजित करने में समस्या आ रही है

मेरे पास कोई PostgreSQL पृष्ठभूमि नहीं है, लेकिन देखते हैं कि यह काम करता है या नहीं:

मैं इसे सरल बनाकर शुरू करूंगा, एक प्रश्न लिखकर जो पहले खिलाड़ी द्वारा कुल स्कोर लौटाता है:

SELECT player_id, SUM(score) score
FROM (
  SELECT first_player as player_id, first_score as score
  FROM matches
  UNION ALL
  SELECT second_player, second_score
  FROM matches
)
GROUP BY player_id

अब, समूह खोजने के लिए उस डेटासेट को खिलाड़ियों से जोड़ें:

SELECT w.player_id, p.group_id, w.score
FROM
(
  SELECT player_id, SUM(score) score
  FROM (
    SELECT first_player as player_id, first_score as score
    FROM matches
    UNION ALL
    SELECT second_player, second_score
    FROM matches
  )
  GROUP BY player_id
) as w
inner join players p
on p.player_id = w.player_id

अब हमारे पास सभी खिलाड़ी हैं, उनका कुल स्कोर और उनका समूह। हम समूह द्वारा विजेता की पहचान करना चाहते हैं? हम रैंकिंग का इस्तेमाल कर सकते हैं ऐसा करने के लिए कार्य:

SELECT 
w.player_id, 
p.group_id, 
w.score, 
RANK() OVER (PARTITION BY p.group_id ORDER BY score DESC) as group_placement
FROM
(
  SELECT player_id, SUM(score) score
  FROM (
    SELECT first_player as player_id, first_score as score
    FROM matches
    UNION ALL
    SELECT second_player, second_score
    FROM matches
  )
  GROUP BY player_id
) as w
inner join players p
on p.player_id = w.player_id

अब हम केवल WHERE . का उपयोग करके प्रत्येक समूह (रैंक =1) में शीर्ष लोगों को चुनते हैं

  SELECT 
  player_id, 
  group_id
  FROM
  (
      SELECT 
      w.player_id, 
      p.group_id, 
      w.score, 
      RANK() OVER (PARTITION BY p.group_id ORDER BY score DESC) as group_placement
      FROM
      (
        SELECT player_id, SUM(score) score
        FROM (
          SELECT first_player as player_id, first_score as score
          FROM matches
          UNION ALL
          SELECT second_player, second_score
          FROM matches
        )
        GROUP BY player_id
      ) as w
      inner join players p
      on p.player_id = w.player_id
    ) as gp
    WHERE group_placement = 1

जटिल लग रहा है? हाँ, लेकिन आप देख सकते हैं कि अंतिम परिणाम थोड़ा-थोड़ा करके प्रदान किया गया है। इसका प्रत्येक चरण एक 'सबटेबल' है और आप प्रत्येक बिंदु पर डेटा को चला और देख सकते हैं।




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. क्लॉज के साथ दो प्रश्नों में स्वाभाविक रूप से कैसे शामिल हों?

  2. Postgresql डेटाबेस स्थिति की जाँच करने के लिए प्रश्न

  3. PostgreSQL - भौतिकीकृत दृश्य स्तंभ मेटाडेटा प्राप्त करें

  4. PostgreSQL 12 में नया क्या है?

  5. [xxx] के लिए त्रुटि अपरिभाषित विधि `to_key':सक्रिय व्यवस्थापक तालिका_for (रेल, पोस्टग्रेस्क्ल, पोस्टग्रेस_एक्सटी मणि) पर सरणी डेटा का उपयोग करने का प्रयास करते समय ऐरे