1

我正在尝试使用以下查询来显示国家人口第二多和人口第二少的国家的人口。我想出了一种方法来选择这些国家的人口,但我找不到任何好方法来实施选择国名。

Select  Max(population) 
From country Where population < (Select max (population) From country)
Union
Select Min(population)
From country where population > (select Min(population) from country) ;

我找到了一种为第二大/第二人口最少的国家选择国家和人口的方法,但问题是我不能union在两个选择中使用 2 ORDER BY(每个选择一个)。

知道我能做些什么来解决我的问题吗? 注意:我使用 Postgres

4

4 回答 4

1

通过使用窗口函数,您可以像这样简单地做到这一点:

with t as (
  select population,
         row_number() over (order by population desc) mx,
         row_number() over (order by population asc) mn
  from country)
select 'second most population', population from t where mx = 2
union all
select 'second least population', population from t where mn = 2;
于 2014-03-26T12:00:57.757 回答
1
select *
from (
    select country, population
    from
        (
            select country, population
            from country
            order by population
            offset 1 limit 1
        ) s

    union

    select country, population
    from
        (
            select country, population
            from country
            order by population desc
            offset 1 limit 1
        ) q
) s
于 2014-03-26T12:03:09.557 回答
0

找到解决方案:

(SELECT name, population 
FROM country 
ORDER BY population Desc 
LIMIT 1 OFFSET 1
) 
UNION
(
SELECT name, population 
FROM country 
ORDER BY population Asc 
LIMIT 1 OFFSET 1);

我需要的只是括号...

于 2014-03-26T12:03:55.080 回答
0

简单,更快:

(
SELECT population
FROM   country
ORDER  BY 1
OFFSET 1
LIMIT  1
)
UNION ALL
)
SELECT population
FROM   country
ORDER  BY 1 DESC
OFFSET 1
LIMIT  1
);

的,您可以将LIMITandOFFSET用于UNION查询的各个分支。只需使用括号。详细信息:
在同一张表上组合两个 SQL SELECT 语句

确保有一个索引population以使更大的表变得非常快。

并使用UNION ALL, 因为您不想折叠重复项。更快,实际上是正确的。

于 2014-03-26T23:11:01.370 回答