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