【问题标题】:How write SQL to select the maximum value in each group?如何编写SQL来选择每组中的最大值?
【发布时间】:2012-05-14 21:04:42
【问题描述】:

假设我们有一个这样的城市的州 (varchar)、城市 (varchar) 和人口 (int) 表,

New York, New York, 8175133
Los Angeles, California, 3792621
Chicago, Illinois, 2695598
San Diego, California, 1307402

我想选择每个州人口最多的城市。结果是,

New York, New York, 8175133
Los Angeles, California, 3792621
Chicago, Illinois, 2695598

如何编写 SQL 来做到这一点?

更新:

让我明确一点:结果应该包含每个州一个人口最多的城市。在上面的示例中,“圣地亚哥”的人口少于“洛杉矶”,因此它不会出现在结果中。

【问题讨论】:

    标签: sql


    【解决方案1】:

    在极少数情况下,如果两个或更多城市人口相同,则会显示两者:

    SELECT 
        t.*
    FROM 
        tableX  t
      JOIN
        ( SELECT State
               , MAX(Population) AS Population 
          FROM tableX
          GROUP BY State
        ) maxp  
            ON  maxp.State = t.State
            AND maxp.Population = t.Population 
    

    如果您的 DBMS 具有分析(窗口)功能,您也可以使用它(与前面显示的关系):

    SELECT 
        City
      , State
      , Population
    FROM 
        ( SELECT City
               , State
               , Population
               , RANK() OVER ( PARTITION BY State 
                               ORDER BY Population DESC )
                   AS RankN
          FROM tableX
        ) maxp  
    WHERE RankN = 1 ;
    

    或者这个(关系已解决,每个状态只返回一行):

    SELECT 
        City
      , State
      , Population
    FROM 
        ( SELECT City
               , State
               , Population
               , ROW_NUMBER() OVER ( PARTITION BY State 
                                     ORDER BY Population DESC 
                                            , City ASC )
                   AS RowN
          FROM tableX
        ) maxp  
    WHERE RowN = 1 ;
    

    SQL-Fiddle中测试

    【讨论】:

      【解决方案2】:
      select *
      from pop 
      where (state, population) in 
         (select state, max(population) 
          from pop 
          group by state);
      

      【讨论】:

        【解决方案3】:

        去做吧:

        SELECT state, city, MAX(population) AS LargestPeople FROM yourtable GROUP BY state DESC
        

        【讨论】:

        • 安德鲁现在怎么样了?我已经更正了我的代码。你怎么看待这件事? ^^
        猜你喜欢
        • 2019-12-03
        • 2022-11-13
        • 2012-01-04
        • 2011-05-29
        • 2020-08-28
        • 2021-10-11
        • 2014-08-24
        • 2014-05-12
        • 1970-01-01
        相关资源
        最近更新 更多