在Sql中配对行

时间:2016-01-07 06:47:26

标签: sql postgresql

我有一个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    

感谢。

2 个答案:

答案 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。在此之后它是一个简单的自连接。

小提琴http://sqlfiddle.com/#!15/d65be/2