我有一个Player
表,其中包含3列id,name,wins(获胜匹配数)。为了进行瑞士配对,两名有近胜的球员将在下一轮比赛中一起比赛,我按胜利排序这个表顺序。如何返回一个包含4列id1,name1,id2,name2的表,以便新表的每一行都是Players表中的行对。我可以用python语言来做,但我想知道SQL中有任何查询可以实现这个任务吗?
例如:
Player
表
Id Name Wins
-----------------
1 A 3
2 B 1
3 C 4
4 D 0
我想返回
Id Name Id Name
---------------------
3 C 1 A
2 A 4 D
感谢。
答案 0 :(得分:0)
WITH ranked_players AS
(SELECT Id, Name, ROW_NUMBER() OVER(ORDER BY wins) rank
FROM Printer)
SELECT player1.Id, player1.Name, player2.Id, player2.Name
FROM ranked_players as player1
JOIN ranked_players as player2
ON player1.rank=player2.rank-1
WHERE player1.rank % 2 = 1
抱歉,我手头没有Postgres来测试。
答案 1 :(得分:0)
以下是如何执行此操作的方法:
with cte as(select *, ceiling(1.0 * row_number() over(order by Wins, Id) / 2) as rn
from Player)
select c1.Id, c1.Name, c2.Id, c2.name
from cte c1
join cte c2 on c1.rn = c2.rn and c1.Id > c2.Id;
这个想法是对具有相同数字的玩家进行排名。因此,当您按胜利排序行时,您将获得1,2,3,4作为排名。然后你将它们乘以1.0只是为了使它成为数字1.0,2.0,3.0,4.0。然后除以2:0.5,1,1.5,2。然后上限到最接近的整数:1,1,2,2。在此之后它是一个简单的自连接。