代码之家  ›  专栏  ›  技术社区  ›  Franz Biberkopf

Oracle:组合子查询和聚合函数

  •  0
  • Franz Biberkopf  · 技术社区  · 2 年前

    我不熟悉数据库和甲骨文,我应该在一张桌子上找到一个世界杯所有国家的所有足球队,他们有最多的中场球员。这是表格结构:

    Player(PlayerID<PK>,Role,Nationname)
    
    

    SELECT DISTINCT nationname, count(role)
    FROM player
    GROUP BY nationname
    HAVING COUNT(role) = (SELECT max(count(role))
                       FROM player
                       WHERE role = 'midfield'
                       GROUP BY nationname);
    
    

    我还尝试了FROM子句中的子查询(我在这个网站上看到很多人使用这种类型的子查询),如下所示:

    SELECT nationname, MAX(midfield) FROM 
    ( SELECT nationname, COUNT(role) midfield
      FROM player
      WHERE role = 'midfield'
      GROUP BY nationname) test
      GROUP BY nationname;
    
    

    输出: enter image description here

    通过这个查询,我离任务越来越近了,但我无法进一步过滤结果,以便只获得洪都拉斯团队。

    2 回复  |  直到 2 年前
        1
  •  1
  •   VBoka    2 年前

    在内部查询中,您可以选择并分组,然后在按已计数角色排序时可以选择第一行。

    select *
    from (SELECT nationname, COUNT(role) midfield
          FROM player
          WHERE role = 'midfield'
          GROUP BY nationname)
    where rownum = 1
    order by midfield desc
    

    如果有多个国家的中场球员最多人数相同,请使用以下方法:

    SELECT nationname, COUNT(role) midfield
    FROM player
    WHERE role = 'midfield'
    GROUP BY nationname
    having count(role) in (select max(count(role)) 
                           from player 
                           where role = 'midfield' 
                           group by nationname)
    

    DEMO

        2
  •  1
  •   Littlefoot    2 年前

    rank 分析函数(为什么不 row_number

    with temp as
      -- rank them first, by count of midfield players in descending order
      (select nationname, 
              rank() over (order by count(*) desc) rnk, 
              count(*) cnt
       from player
       where role = 'midfield'
       group by nationname
      )
    -- now, fetch nation which ranks as the highest
    select nationname, cnt
    from temp
    where rnk = 1;