我正在编写一个程序,使用postgresql来显示一个视频游戏锦标赛的排名,该比赛在5人的循环赛中进行,所以有可能在某个地方有3种平局。我发现了从头对头确定胜利者的逻辑:Here和这是非常有用的,但它不适用于3路平局。我稍微修改了模式,下面是im使用的内容:
[poolteam]
-team
-wins
[versus]
-team1
-team2
-win 对决表只是告诉我们谁赢了两支球队的比赛。然后我把它传递到一张新的桌子上,从而得到球队的排名。
select team, wins, RANK() OVER (ORDER BY wins desc) AS rank
INTO rankTable
from poolteam;然后使用链接的答案,我可以得到级别和头到头的领带打破。我写这篇文章是为了找出是否有两个以上的队伍拥有相同的级别
select rank
from finalStandings
group BY rank having count(*) >2逻辑首先看大多数胜利,然后头对头,然后如果两个以上平局的球队--所有球队的头对头--打成平手,下面是一个例子:
Team A 3-1
Team B 2-2
Team C 2-2
Team D 2-2
Team E 1-3A队击败B,C,E,B队击败C&D,C队击败E&D,D队击败E&A,E队击败B。
在这种情况下,三支平局球队(B,C,D)有2胜,但由于B击败了两支平局,他们将获得第2,C将获得第3,因为他们赢了头对头赢D。
在所有三支球队都击败对方的情况下,打破平局的人看比赛赢了,打成平局的球队,这很容易计算,这正是我需要帮助的一个场景。
发布于 2018-12-28 22:55:27
对于三支同级别平局的球队,A、B和C,或者:
你可以看到这一点,因为如果三支球队的级别相同,并且曾经互相比赛过一次,那么就会有三场比赛,三场胜利,但是没有一支球队打过两场比赛,所以要么是1,1,1,2,1,0。这意味着,有了一张胜利表和一张有排名的球队表,你就可以通过简单地数排名中的胜利和按那些来排序就可以得到你想要的结果。
假设您已经得到了以下模式:名为“团队队伍”的表名为“名称”、“赢”和“损失”列,以及一个名为“胜利者”和“输家”列的匹配表,您可以使用:
模式:
CREATE TABLE matches (winner CHAR(1), loser CHAR(1));
insert into matches (winner, loser) values('A','B');
insert into matches (winner, loser) values('A','C');
insert into matches (winner, loser) values('D','A');
insert into matches (winner, loser) values('A','E');
insert into matches (winner, loser) values('B','C');
insert into matches (winner, loser) values('B','D');
insert into matches (winner, loser) values('E','B');
insert into matches (winner, loser) values('C','D');
insert into matches (winner, loser) values('C','E');
insert into matches (winner, loser) values('D','E');
create table team (name CHAR(1));
insert into team (name) VALUEs('A');
insert into team (name) VALUEs('B');
insert into team (name) VALUEs('C');
insert into team (name) VALUEs('D');
insert into team (name) VALUEs('E');
CREATE TABLE TEAMSTAT (NAME CHAR(1), WINS SMALLINT, LOSSES SMALLINT);
insert into teamstat SELECT T.NAME,
coalesce(m1.wins,0) as wins,
coalesce(m2.losses,0) as losses
from team t
LEFT JOIN(select winner, count(winner) as wins
from matches
group by winner
) m1 ON m1.winner = t.name
LEFT JOIN(select loser, count(loser) as losses
from matches
group by loser
) m2 ON m2.loser = t.name查询:
select t.name, t.wins, t.losses
, sum(case when t.name = m.winner and t.wins = t2.wins then 1 else 0 end) as wins_in_rank
, sum(case when t.name = m.winner and t.wins <= t2.wins then 1 else 0 end) as wins_in_or_above_rank
from teamstat t
left join teamstat t2 on t2.name <> t.name and t.wins <= t2.wins
left join matches m on m.winner in (t2.name, t.name) and m.loser in(t2.name, t.name)
group by t.name, t.wins, t.losses
order by t.wins desc, "wins_in_rank" desc, "wins_in_or_above_rank" desc更新小提琴:http://sqlfiddle.com/#!17/585c8d/13/0
https://stackoverflow.com/questions/48950943
复制相似问题