Sql中的行配对

Sql中的行配对,sql,postgresql,Sql,Postgresql,我有一个Player表,表中有3列id、name、wins(赢的比赛数)。为了在瑞士配对,在下一轮比赛中,两名几乎获胜的玩家将一起比赛,我按赢数对这张桌子进行排序。如何返回具有4列id1、name1、id2、name2的表,以使新表的每一行都是表中的一对行。我可以用python语言来完成,但我想知道SQL中是否有任何查询可以实现此任务 例如: Player表 Id Name Wins ----------------- 1 A 3 2 B 1 3

我有一个
Player
表,表中有3列id、name、wins(赢的比赛数)。为了在瑞士配对,在下一轮比赛中,两名几乎获胜的玩家将一起比赛,我按赢数对这张桌子进行排序。如何返回具有4列id1、name1、id2、name2的表,以使新表的每一行都是表中的一对行。我可以用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     B      4    D    
谢谢

WITH ranked_players AS 
    (SELECT Id, Name, ROW_NUMBER() OVER(ORDER BY wins) rank
    FROM Player)
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
对不起,我手头没有博士后考试


很抱歉,我手头没有博士后考试。

以下是如何做到这一点:

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


Fiddle

以下是您可以做到这一点的方法:

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


小提琴

要做到这一点肯定没有简单的方法。我也不认为有什么困难。我把你的问题编辑成了更容易阅读的形式。。。但是有一个问题。你的愿望输出结果。。。第二排的id 2名称A。。。这应该是B吗?你的帖子现在看起来更像是一个待办事项,而不是一个问题。你能不能包括一些尝试、研究等,以及对你的场景的一个小的复制?(它也可能有助于将您正在使用的rdbms作为标记。)您是否希望将赢得最高胜利的玩家配对?什么是rdbms?@tuang,你愿意回答问题吗?什么是rdbms?当然没有简单的方法可以做到这一点。我也不认为有什么困难。我把你的问题编辑成了更容易阅读的形式。。。但是有一个问题。你的愿望输出结果。。。第二排的id 2名称A。。。这应该是B吗?你的帖子现在看起来更像是一个待办事项,而不是一个问题。你能不能包括一些尝试、研究等,以及对你的场景的一个小的复制?(它也可能有助于将您正在使用的rdbms作为标记。)您是否希望将赢得最高胜利的玩家配对?什么是rdbms?@tuang,你愿意回答问题吗?什么是关系数据库管理系统?