【问题标题】:Improve query to get most games won改进查询以赢得大多数比赛
【发布时间】:2022-01-18 04:17:45
【问题描述】:

问题如下:

team season games_won
San Francisco Giants 2010 92
San Francisco Giants 2011 86
San Francisco Giants 2012 94
San Francisco Giants 2013 76
San Francisco Giants 2014 88
Los Angeles Dodgers 2010 80
Los Angeles Dodgers 2011 82
Los Angeles Dodgers 2012 86
Los Angeles Dodgers 2013 92
Los Angeles Dodgers 2014 94

编写 SQL 以生成以下输出,其中第二列是每支球队获胜次数最多的赛季。下面显示了巨人队和道奇队以进行说明,但 SQL 应该同时拉动所有球队:

我有两种方法可以解决这个问题:

方法一

WITH cte_wins
 AS (SELECT team,
            Max(games_won) AS most_wins
     FROM   table_wins
     GROUP  BY team)
SELECT table_wins.team,
       table_wins.season AS season_with_most_wins
FROM   table_wins
       JOIN cte_wins
         ON cte_wins.team = table_wins.team
            AND cte_wins.most_wins = table_wins.games_won 

方法二

SELECT table_wins.team,
       table_wins.season AS season_with_most_wins
FROM   table_wins
       JOIN (SELECT team,
                    Max(games_won) AS most_wins
             FROM   table_wins
             GROUP  BY team) AS sub
         ON sub.team = table_wins.team
            AND sub.most_wins = table_wins.games_won 

方法3

有没有更好的方法来解决这个问题?我想知道我的方法是否很糟糕,也许我应该尝试其他方法。欢迎任何和所有反馈。

【问题讨论】:

标签: sql sql-server optimization subquery common-table-expression


【解决方案1】:

我认为您可能真的在询问哪个球队每个赛季的胜利最多,而不仅仅是最多胜利...为此,您可能最好使用类似的 over/partition

select
        PQ.*
    from
    ( select
            TW.season,
            TW.Team,
            TW.Games_Won,
            RANK() OVER ( PARTITION BY TW.Season 
                            ORDER BY games_won desc ) SeasonPlace
        FROM 
            __Team_Wins TW ) PQ
    where
        PQ.SeasonPlace = 1

内部 Pre-Query(PQ 别名)拉取所有行并按季节对其进行预排序,并且在每个季节内,基于 games_won 降序排列的 ORDERS,从而将最高的游戏放在首位。因此,RANK() 成为“SeasonPlace”列结果的连续 1、2、3 等。

所以现在,它变成了内部查询,并携带了所有其他字段。然后,外部查询应用 WHERE 子句,仅获取球队及其在每个赛季中排名第一的所有详细信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-07
    • 2020-08-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2022-01-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多