首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >根据谁赢了比赛,在池中排名相等的球队

问根据谁赢了比赛,在池中排名相等的球队
EN

Stack Overflow用户
提问于 2015-09-30 22:44:37
回答 3查看 1.7K关注 0票数 3

我正在编写一个应用程序,用来计算橄榄球比赛(橄榄球世界杯2015,但它可以适用于许多其他基于泳池的比赛)中的球队在台球阶段的排名。

在池阶段结束时,根据胜数/平局/损失/奖金点数计算分数,并按分数对团队进行排名。如果两支或两支以上的球队得分相等,那么在两支平局的比赛中,胜利者将是较高的排名。一旦这个初始排名完成,其他标准(分数差、尝试差、得分、尝试得分)将被用于完成排名过程。

我已经写了一个查询,做了上述所有的事情,除了第一个排名标准--两个队的分数级别应该根据两支球队所打的比赛的胜利者来排序。。

以下是我的数据库模式:

代码语言:javascript
复制
[TEAM]        [MATCH]
-TeamId       -MatchId
-TeamName     -HomeTeamId
-Pool         -AwayTeamId
              -HomeTeamScore
              -HomeTeamTries
              -AwayTeamScore
              -AwayTeamTries

下面是用于计算给定池的排名/排名的Server查询:

代码语言:javascript
复制
WITH PoolResults ([MatchId], [TeamId], [Team], [P], [W], [D], [L], [PF], [PA], [PD], [TF], [TA], [TD], [PTS], [BP]) 
AS (SELECT 
        M.[MatchId], 
        M.[HomeTeamId] AS [TeamId], 
        HT.[TeamName], 
        1 AS [P], 
        CASE WHEN M.[HomeTeamScore] > M.[AwayTeamScore] THEN 1 ELSE 0 END AS [W], 
        CASE WHEN M.[HomeTeamScore] = M.[AwayTeamScore] THEN 1 ELSE 0 END AS [D], 
        CASE WHEN M.[HomeTeamScore] < M.[AwayTeamScore] THEN 1 ELSE 0 END AS [L], 
        M.[HomeTeamScore] AS [PF], 
        M.[AwayTeamScore] AS [PA], 
        (M.[HomeTeamScore] - M.[AwayTeamScore]) AS [PD], 
        M.[HomeTeamTries] AS [TF], 
        M.[AwayTeamTries] AS [TA], 
        (M.[HomeTeamTries] - M.[AwayTeamTries]) AS [TD], 
        CASE 
            WHEN M.[HomeTeamScore] > M.[AwayTeamScore] THEN 4 
            WHEN M.[HomeTeamScore] = M.[AwayTeamScore] THEN 2 
            WHEN M.[HomeTeamScore] < M.[AwayTeamScore] THEN 0 
        END AS [PTS], 
        CASE 
            WHEN ((M.[AwayTeamScore] - M.[HomeTeamScore]) BETWEEN 1 AND 7) AND M.[HomeTeamTries] >= 4 THEN 2 
            WHEN ((M.[AwayTeamScore] - M.[HomeTeamScore]) BETWEEN 1 AND 7) THEN 1 
            WHEN M.[HomeTeamTries] >= 4 THEN 1 
            ELSE 0 
        END AS [BP] 
    FROM 
        Match AS M 
        INNER JOIN Team AS HT 
            ON M.[HomeTeamId] = HT.[TeamId] 
    WHERE 
        M.[HomeTeamScore] IS NOT NULL 
        AND HT.[Pool] = @Pool

    UNION 

    SELECT 
        M.[MatchId], 
        M.[AwayTeamId] AS [TeamId], 
        AT.[TeamName], 
        1 AS [P], 
        CASE WHEN M.[AwayTeamScore] > M.[HomeTeamScore] THEN 1 ELSE 0 END AS [W], 
        CASE WHEN M.[AwayTeamScore] = M.[HomeTeamScore] THEN 1 ELSE 0 END AS [D], 
        CASE WHEN M.[AwayTeamScore] < M.[HomeTeamScore] THEN 1 ELSE 0 END AS [L], 
        M.[AwayTeamScore] AS [PF], 
        M.[HomeTeamScore] AS [PA], 
        (M.[AwayTeamScore] - M.[HomeTeamScore]) AS [PD], 
        M.[AwayTeamTries] AS [TF], 
        M.[HomeTeamTries] AS [TA], 
        (M.[AwayTeamTries] - M.[HomeTeamTries]) AS [TD], 
        CASE 
            WHEN M.[AwayTeamScore] > M.[HomeTeamScore] THEN 4 
            WHEN M.[AwayTeamScore] = M.[HomeTeamScore] THEN 2 
            WHEN M.[AwayTeamScore] < M.[HomeTeamScore] THEN 0 
        END AS [PTS], 
        CASE 
            WHEN ((M.[HomeTeamScore] - M.[AwayTeamScore]) BETWEEN 1 AND 7) AND M.[AwayTeamTries] >= 4 THEN 2 
            WHEN ((M.[HomeTeamScore] - M.[AwayTeamScore]) BETWEEN 1 AND 7) THEN 1 
            WHEN M.[AwayTeamTries] >= 4 THEN 1 
            ELSE 0 
        END AS [BP] 
    FROM 
        Match AS M 
        INNER JOIN Team AS AT 
            ON M.[AwayTeamId] = AT.[TeamId] 
    WHERE 
        M.[AwayTeamScore] IS NOT NULL 
        AND AT.[Pool] = @Pool 
    )

SELECT ROW_NUMBER() 
    OVER (ORDER BY 
            SUM([BP] + [PTS]) DESC, 
            SUM([PD]) DESC, 
            SUM([TD]) DESC, 
            SUM([PF]) DESC, 
            SUM([TF]) DESC) AS [Position], 
    [TeamId], 
    [TeamName], 
    SUM([P]) AS [P], 
    SUM([W]) AS [W], 
    SUM([D]) AS [D], 
    SUM([L]) AS [L], 
    SUM([PF]) AS [PF], 
    SUM([PA]) AS [PA], 
    SUM([PD]) AS [PD], 
    SUM([TF]) AS [TF], 
    SUM([TA]) AS [TA], 
    SUM([BP]) AS [BP], 
    SUM([BP] + [PTS]) AS [PTS] 
FROM 
    PoolResults 
GROUP BY 
    [TeamId], 
    [TeamName];

正如前面提到的,这做了所有的事情,除了考虑两支球队在相同的分数上的排名,基于他们之间谁赢了比赛。,有人对如何做这个初始排名有什么建议吗?

=====更新到原始的=====

CLARIFICATION -可以有两个以上的球队在等分,在这种情况下,每个组合的两个团队必须进行评估,以确定排名。下面的SqlFiddle示例演示了一个场景,其中有5个团队在一个池中,其中3个团队有相同的点数- http://sqlfiddle.com/#!6/c0701/3

查询1显示原始的比赛数据(哪些队打过比赛和分数)

查询2显示未排序的池排名:

代码语言:javascript
复制
Australia (10)
England (10)
Fiji (5)
Uruguay (0)
Wales (10)

查询3显示按点排序的池位:

代码语言:javascript
复制
Australia (10)
England (10)
Wales (10)
Fiji (5)
Uruguay (0)

然而,真正的秩序应该是:

代码语言:javascript
复制
Wales (10)
England (10)
Australia (10)
Fiji (5)
Uruguay (0)

威尔士的排名高于英格兰,因为威尔士击败了英格兰,英格兰的排名高于澳大利亚,因为英格兰击败了澳大利亚。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-10-01 00:25:59

这需要sql 2012+使用LEAD()和LAG() 函数,此时也只需要两个团队拥有相同的排名。

模式

代码语言:javascript
复制
CREATE TABLE Table1
    ([team] varchar(1), [rank] int);

INSERT INTO Table1
    ([team], [rank])
VALUES
    ('A', 1),('B', 1),('C', 2);

CREATE TABLE Table2
    ([team1] varchar(1), [team2] varchar(1), [win] varchar(1));

INSERT INTO Table2
    ([team1], [team2], [win])
VALUES
    ('A', 'B', 'B'), ('C', 'A', 'A'),('C', 'B', 'B');

SQL Fiddle演示

代码语言:javascript
复制
WITH breakTie AS ( 
    SELECT
        [team],
        [rank],
        LAG([team]) OVER (ORDER BY [rank]) PreviousTeam,
        LEAD([team]) OVER (ORDER BY [rank]) NextTeam,
        LAG([rank]) OVER (ORDER BY [rank]) PreviousRank,
        LEAD([rank]) OVER (ORDER BY [rank]) NextRank
    FROM Table1
)
SELECT *, CASE 
       WHEN B.[rank] = B.[NextRank] and B.[team] = T.[win] THEN 1
       WHEN B.[rank] = B.[PreviousRank] and B.[team] = T.[win] THEN 1
       ELSE 0
    END as breakT
FROM breakTie B
LEFT JOIN Table2 T
   ON ( B.team = T.team1 or B.team = T.team2)
  AND ( B.NextTeam = T.team1 or B.NextTeam = T.team2)
ORDER BY 
    [rank],
    CASE 
       WHEN B.[rank] = B.[NextRank] and B.[team] = T.[win] THEN 1
       WHEN B.[rank] = B.[PreviousRank] and B.[team] = T.[win] THEN 1
       ELSE 0
    END
票数 1
EN

Stack Overflow用户

发布于 2015-10-01 00:06:52

这很复杂,但我会尝试以下几点。

  1. 观察对手的每一个组合以及谁赢了平局。
  2. 使用当前排名的结果,可以使用窗口函数将一个列添加给先前的玩家,一个列用于先前的排名,另一个列添加到下一个级别。
  3. 连接到步骤1中的视图
  4. 创建一个case语句,该语句只设置一个值,如果优先级别或下一个级别相等,则该值具有步骤1中视图中的值。
  5. 按秩和步骤4中的列进行排序
票数 1
EN

Stack Overflow用户

发布于 2015-10-01 18:17:48

我想补充一些其他的建议。因为您当前的问题有一些矛盾,并且可能没有一个正确的答案,用当前的规则回答。

​

  • 第一张图4队平局在同一级别。如果您使用前4行的信息。你得到了一个职位,D, A, B, C,但最后两个不能强制执行。
    • 在NFL中,他们有一些被称为inside conference win的平局。所以你可以数一数每支球队在这个小组里有多少胜利,作为一种秩序的方式。
    • 所以现在所有的条件都是对比较。
    • 在这种情况下,A和D有更多的胜利和D击败A。
    • 现在C拍打B,A拍打C,你得到了一个真正的顺序。

​

  • 但如图2所示,你可以让每个人平局2胜。

我猜你应该分析一下这些限制。也许规则的顺序是不同的,您可以将这个问题减少到一个只有两个团队平手的问题。

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

https://stackoverflow.com/questions/32876744

复制
相关文章

相似问题

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