【问题标题】:SQL Query: second most and second leastSQL 查询:第二多和第二少
【发布时间】:2014-02-12 16:01:25
【问题描述】:

所以我有这种关系 国家(名称、代码、首都、省、地区、人口)

我想找出人口第二多和人口第二少的国家。

到目前为止,我有这个;

select name, population
from
(select distinct name, population from country order by population desc limit 2) as A
order by population asc limit 1;

我只得到第二大人口大国。我的问题是从这里开始的,我很想在括号中加入一个 asc 并收集两个结果,至少这是我能为这个问题提出的唯一解决方案。我应该如何进行?有没有更简单的方法?

【问题讨论】:

  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?这可以使用窗口函数轻松解决。

标签: sql database join


【解决方案1】:

要获得人口第二多的国家/地区,请使用 limit 和偏移量:

select name, population
from country c
order by population asc
limit 1 offset 1;

要获得第二少的人口,请将asc 更改为desc。您可以使用union all 一起执行此操作:

(select name, population
 from country c
 order by population asc
 limit 1 offset 1
) union all
(select name, population
 from country c
 order by population desc
 limit 1 offset 1
)

请注意,如果您只有三个国家/地区,那么这仍将返回两行 - 同一个国家/地区被重复。如果要删除重复项,可以将 union all 更改为 union。

【讨论】:

  • 不知道这是否是 PostgreSQL 搞砸了我,但当我尝试执行第一个查询时,我得到“提示:使用单独的 LIMIT 和 OFFSET 子句”。
  • 谢谢。我不得不做“限制1偏移1”。问题已解决,感谢您的帮助! :)
  • @AdamSmith 。 . .这个问题没有用数据库标记,所以我使用的是 MySQL 语法。
【解决方案2】:

试试:

请注意,如果有任何国家有平局,这将为您提供 2+ 行,而限制行将切断平局。

select name, population, '2nd highest' as which
  from country
 where population =
       (select max(population)
          from country
         where population < (select max(population) from country))
union all
select name, population, '2nd lowest' as which
  from country
 where population =
       (select min(population)
          from country
         where population > (select min(population) from country))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-02
    • 1970-01-01
    • 1970-01-01
    • 2015-01-10
    • 2016-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多