【问题标题】:Query simplification Oracle Northwind查询简化 Oracle Northwind
【发布时间】:2016-04-06 18:37:25
【问题描述】:

任务:

查找最多客户所属的国家/地区。

查询

SELECT country,
       count(*)
FROM customers
GROUP BY country
HAVING count(*) =
  (SELECT max(max_sal)
   FROM
     (SELECT count(*) max_sal
      FROM customers
      GROUP BY country)) ;

结果

结果是正确的,但我认为编写查询的方法很困难

问题:有什么简单的方法可以重写这个查询。

【问题讨论】:

  • 可以使用窗口函数吗?
  • @vkp 我从不使用窗口功能

标签: sql database oracle northwind


【解决方案1】:

我可能遗漏了一些东西,但它可以像这样简单:

SELECT *
  FROM (  SELECT country, COUNT (*) max_sal
            FROM customers
        GROUP BY country
        ORDER BY COUNT (*) DESC)
 WHERE ROWNUM <= 1;

【讨论】:

    【解决方案2】:

    你可以使用WITH子句:

    WITH
      c AS ( 
        SELECT country, Count(1) n
        FROM customers
        GROUP BY country)
    SELECT country, n 
    FROM c
    WHERE n = (SELECT Max(n) FROM c)
    

    【讨论】:

      【解决方案3】:

      你可以使用分析函数 over() 得到结果的每一行的最大值(平均值、最小值等)的结果,然后在哪里比较 count(1) 和 max(count(1))

      这是一个例子:

      SELECT country, cnt, max_cnt
        FROM (SELECT country, COUNT(1) AS cnt, MAX(COUNT(1)) over() max_cnt
                 FROM customers
                GROUP BY country)
       WHERE cnt = max_cnt
      

      【讨论】:

        【解决方案4】:
        SELECT Country, MAX(N) FROM (
            SELECT Country, COUNT(*) as N FROM CUSTOMERS GROUP BY Country
        );
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-26
          • 2011-01-30
          • 1970-01-01
          相关资源
          最近更新 更多