首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL 3路逻辑

SQL 3路逻辑
EN

Stack Overflow用户
提问于 2018-02-23 15:15:06
回答 1查看 265关注 0票数 5

我正在编写一个程序,使用postgresql来显示一个视频游戏锦标赛的排名,该比赛在5人的循环赛中进行,所以有可能在某个地方有3种平局。我发现了从头对头确定胜利者的逻辑:Here和这是非常有用的,但它不适用于3路平局。我稍微修改了模式,下面是im使用的内容:

代码语言:javascript
复制
[poolteam]
-team 
-wins
 [versus]
 -team1
 -team2
 -win 

对决表只是告诉我们谁赢了两支球队的比赛。然后我把它传递到一张新的桌子上,从而得到球队的排名。

代码语言:javascript
复制
select team, wins, RANK() OVER (ORDER BY wins desc) AS rank 
    INTO rankTable 
from poolteam;

然后使用链接的答案,我可以得到级别和头到头的领带打破。我写这篇文章是为了找出是否有两个以上的队伍拥有相同的级别

代码语言:javascript
复制
select rank 
from finalStandings 
group BY rank having count(*) >2

逻辑首先看大多数胜利,然后头对头,然后如果两个以上平局的球队--所有球队的头对头--打成平手,下面是一个例子:

代码语言:javascript
复制
Team A 3-1
Team B 2-2
Team C 2-2
Team D 2-2
Team E 1-3

A队击败B,C,E,B队击败C&D,C队击败E&D,D队击败E&A,E队击败B。

在这种情况下,三支平局球队(B,C,D)有2胜,但由于B击败了两支平局,他们将获得第2,C将获得第3,因为他们赢了头对头赢D。

在所有三支球队都击败对方的情况下,打破平局的人看比赛赢了,打成平局的球队,这很容易计算,这正是我需要帮助的一个场景。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-12-28 22:55:27

对于三支同级别平局的球队,A、B和C,或者:

  1. 一队(如A)击败B和C,一队(如B)击败一队(C),一队(C)没有击败任何球队或
  2. 所有球队都完全击败了另一支球队,并且有一个周期(例如A击败B,B击败C,C击败A)。

你可以看到这一点,因为如果三支球队的级别相同,并且曾经互相比赛过一次,那么就会有三场比赛,三场胜利,但是没有一支球队打过两场比赛,所以要么是1,1,1,2,1,0。这意味着,有了一张胜利表和一张有排名的球队表,你就可以通过简单地数排名中的胜利和按那些来排序就可以得到你想要的结果。

假设您已经得到了以下模式:名为“团队队伍”的表名为“名称”、“赢”和“损失”列,以及一个名为“胜利者”和“输家”列的匹配表,您可以使用:

模式:

代码语言:javascript
复制
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

查询:

代码语言:javascript
复制
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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48950943

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档