【问题标题】:SQL Max Value for a Specified Limit指定限制的 SQL 最大值
【发布时间】:2019-03-04 19:02:07
【问题描述】:

我正在尝试返回满足某些条件的年份列表,但我无法使用 MAX 函数并让它与我的其余逻辑一起工作。

对于以下两个表:

          coach
coach | team | wins | year
------+------+------+------
nk01  | a    | 4    | 2000
vx92  | b    | 1    | 2000
nk01  | b    | 5    | 2003
vx92  | a    | 2    | 2003

           team
team | worldcupwin | year
-----+-------------+------
a    | Y           | 2000
b    | N           | 2000
a    | Y           | 2003
b    | N           | 2003

我想得到以下输出:

years
-----
2000

打印的年份是当年获胜次数最多的教练组也赢得了世界杯。

我决定使用 MAX 函数,但很快就遇到了不知道如何使用它的问题,只能查找某一年的最大值。这是我到目前为止所得到的:

SELECT y.year
FROM (SELECT c.year, MAX(c.wins), c.team
      FROM coach AS c
      WHERE c.year >= 1999
      GROUP BY c.year, c.team) AS y, teams AS t
WHERE y.year = t.year AND t.worldcupwin = 'Y' AND y.team = t.team;

此查询为我输出 1999 年之后的所有年份,而不仅仅是那些获胜最多的教练也赢得了世界杯的年份。 (使用 postgresql)

感谢任何帮助!

【问题讨论】:

    标签: sql database postgresql max


    【解决方案1】:

    您可以使用相关子查询

    DEMO

       SELECT c.year, c.team
          FROM coachs AS c inner join teams t on c.team = t.team and c.year=t.year
          WHERE c.year >= 1999 and exists (select 1 from coachs c1 where c.team=c1.team 
          having max(c1.wins)=c.wins) 
    

    和 t.worldcupwin = 'Y'

    输出:

    year    team
    2000    a 
    

    【讨论】:

    • exists 在这里做什么?我正在缩小一些答案,但并非所有答案都是正确的。
    • 它将检查团队是否有最大胜利@Wintress
    • 我明白了。这个条件是否检查它是否是该特定年份的最大胜利?还是一般?
    • 你每年需要它还是一般@Wintress
    • 好的,这部分有效,但忽略了最后一部分 t.worldcupwin = 'Y',因为我从 c.year 和 c.team 中进行选择。所以即使 t.worldcupwin 为 N,它仍然会输出一年。我每年也需要它!发
    【解决方案2】:

    以下查询使用DISTINCT ON

    SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
    FROM coach AS c
    INNER JOIN team AS t ON c.team = t.team AND c.year = t.year 
    WHERE c.year > 1999 
    ORDER BY year, wins DESC
    

    为了返回每年获胜次数最多的记录

    year    wins    worldcupwin team
    ---------------------------------
    2000    4       Y           a
    2003    5       N           b
    

    过滤掉没有赢得世界杯的球队:

    SELECT year, team
    FROM (
       SELECT DISTINCT ON (year) c.year, wins, worldcupwin, c.team
       FROM coach AS c
       INNER JOIN team AS t ON c.team = t.team AND c.year = t.year 
       WHERE c.year > 1999 
       ORDER BY year, wins DESC) AS t
    WHERE t.worldcupwin = 'Y'       
    ORDER BY year, wins DESC
    

    给出预期的结果:

    year    team
    -------------
    2000    a
    

    Demo here

    【讨论】:

      【解决方案3】:

      您可以使用以下方法获得所需的结果:

      简单的方法

      SELECT TOP 1 c.year 
      
      FROM coach AS c INNER JOIN team AS t ON c.team = t.team AND c.year = t.year
      
      WHERE t.worldcupwin = 'Y'
      
      ORDER BY c.wins DESC;
      

      【讨论】:

        【解决方案4】:

        使用row_number()窗口函数

        select a.coach,a.team,a.win,a.year from 
        
         (select c.*,t.*,
        row_number()over(order by wins desc) rn 
        from  coach c join team t on c.team=t.team
         where worldcupwin='Y'
         ) a where a.rn=1
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2022-01-17
          • 1970-01-01
          • 2019-06-23
          • 2023-03-10
          • 2019-11-12
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多