Tôi không có bất kỳ nền tảng PostgreSQL nào nhưng hãy xem điều này có hoạt động không:
Tôi sẽ bắt đầu điều này bằng cách đơn giản hóa nó, bằng cách viết một truy vấn mà trước tiên trả về tổng điểm của người chơi:
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
Bây giờ, hãy nối tập dữ liệu đó với người chơi để tìm các nhóm:
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
Bây giờ chúng tôi có tất cả các cầu thủ, tổng điểm của họ và nhóm của họ. Chúng tôi muốn xác định người chiến thắng theo nhóm? Chúng tôi có thể sử dụng xếp hạng các chức năng để thực hiện việc này:
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
Bây giờ chúng ta chỉ cần chọn những người hàng đầu trong mỗi nhóm (xếp hạng =1) bằng cách sử dụng WHERE
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
Có vẻ phức tạp? có, nhưng bạn có thể thấy kết quả cuối cùng được cung cấp từng chút một. Mỗi bước này là một 'bảng con' và bạn có thể chạy và quan sát dữ liệu tại mỗi điểm.