簡體   English   中英

SQL 幫助MAX查詢

[英]SQL help with MAX query

我有一張名為 bbc(名稱、地區、面積、人口、gdp)的國家/地區表

我想要一張按地區列出最大(人口最多)國家的地區、名稱和人口的表格。 到目前為止,我已經嘗試過:

SELECT region, name, MAX(population)
FROM bbc
GROUP BY region

它給了我一條錯誤消息:ORA-00979: Not a GROUP BY Expression

我試圖更改為 GROUP BY 區域、名稱,但它沒有給我正確的表

您可以對這樣的查詢使用分析:

SELECT name, region, population
  FROM (SELECT region, name, population
             , MAX(population) OVER (PARTITION BY region) maxpop
          FROM bbc)
 WHERE population = maxpop;

內聯視圖為您提供了一個看起來像您的基表的表,以及一個包含該地區最大人口的額外列。 您的頂級 select 為您提供每個地區最大國家的國家、地區和人口。

用一個有限的例子來說明:

SELECT * FROM bbc;

REGION          NAME        POPULATION
--------------- -------     ----------
North America   USA         300000000
North America   Canada      100000000
North America   Mexico       50000000
South America   Brazil       50000000
South America   Argentina    40000000
South America   Venezuela    20000000

添加解析 function:

SELECT region, NAME, population
     , MAX(population) OVER (PARTITION BY region) maxpop
  FROM bbc;

REGION          NAME                POPULATION      MAXPOP
--------------- -------             ----------      ----------
North America   USA                 300000000       300000000
North America   Canada              100000000       300000000
North America   Mexico               50000000       300000000
South America   Brazil               50000000        50000000
South America   Argentina            40000000        50000000
South America   Venezuela            20000000        50000000

然后成品:

NAME    REGION             POPULATION
------- ---------------    -----------
USA     North America       300000000
Brazil  South America        50000000

再編輯一次。 您可以避免嵌套 select,但不能避免子查詢:

SELECT NAME, region, population
  FROM bbc
 WHERE (region, population) IN
       (SELECT region, MAX(population)
          FROM bbc
         group by region);

這是最簡單和最短的方法,因為 Oracle 具有元組測試,它可以使代碼更短:

首先,獲取每個區域的最大人口:

SELECT region, MAX(population)
FROM bbc
GROUP BY region

然后針對它測試國家:

select region, name, population 
from bbc 
where (region, population) in
      (SELECT region, MAX(population)
       FROM bbc
       GROUP BY region)
order by region

如果要支持許多 RDBMS,請使用 EXISTS:

select region, name, population 
from bbc o
where exists
      (SELECT null -- neutral. doesn't invoke Cargo Cult Programming ;-)
       FROM bbc
       WHERE region = o.region 
       GROUP BY region
       HAVING o.population = MAX(population) )
order by region

這里測試的查詢,都有類似的 output: http://sqlzoo.net/0.htm

http://www.ienablemuch.com/2010/05/why-is-exists-select-1-cargo-cult.html

在絕大多數花瓶中,ORA-00979 錯誤是由於 GROUP BY 子句中未包含非聚合列而導致的。 在這種情況下,您還需要在 GROUP BY 子句中包含名稱 此外,您不應在 FROM 語句中調用 MAX function。

SELECT region, name, MAX(population)
FROM bbc
GROUP BY region, name

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM