我有一個非常簡單的表格countries(name, gdp, continent),其中包含從 Wikipedia 收集的資料(實際上,這并不重要)。如果我想知道每個大陸有多少個國家
SELECT continent, COUNT(*) AS cnt
FROM countries
GROUP BY continent;
我得到以下結果:
continent | cnt
--------------- -----
Africa | 56
Asia | 46
South America | 12
North America | 22
Europe | 46
Oceania | 14
所以我對每個內容都有對應的國家。無論如何,只有 196 行,因此資料非常小。
不,我想使用查詢來獲取每個大陸 GDP 最大的國家/地區。查詢也很簡單,如下所示:
SELECT name, continent, gdp
FROM countries c1
WHERE gdp >= ALL (SELECT gdp
FROM countries c2
WHERE c2.continent = c1.continent);
但是,我得到的結果是:
name | continent | gdp
---------------------------- --------------- ----------------
Australia | Oceania | 1748000000000
Brazil | South America | 1810000000000
People's Republic of China | Asia | 19910000000000
United States | North America | 25350000000000
簡而言之,缺少對應的國家Europe和Africa地區。通過查看資料,GDP 最高的國家是德國,但我不明白為什么它不在結果集中。
作為測驗,如果我運行查詢
SELECT continent, MAX(GDP) AS max_gdp
FROM countries
GROUP BY continent;
我正確地獲得了每個大陸的 6 個 GDP 值(包括德國的正確值):
continent | max_gdp
--------------- ----------------
Africa | 498060000000
Asia | 19910000000000
South America | 1810000000000
North America | 25350000000000
Europe | 4319000000000
Oceania | 1748000000000
為什么ALL查詢缺少歐洲和非洲國家的 2 行?
uj5u.com熱心網友回復:
問題原來是 NULL 值,正如 a_horse_with_no_name 所懷疑的那樣。
請注意,在 PostgreSQL 中撰寫此查詢有一種更高效的方式:
SELECT DISTINCT ON (continent)
name, continent, gdp
FROM countries
ORDER BY continent, gdp DESC NULLS LAST;
對于每個大陸,這將按ORDER BY順序輸出第一行。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/480572.html
標籤:sql PostgreSQL
