Выбор двух столбцов в одной таблице несколько раз

Я пытаюсь использовать приведенный ниже запрос, который показывает страну и население второй по величине и второй наименее густонаселенной страны. Я нашел способ выбрать население для этих стран, но я не могу найти хороший способ реализовать выбор названий стран.

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


person Max Mansour    schedule 26.03.2014    source источник
comment
Намного лучше реализовано с использованием OFFSET 1 LIMIT 1 и ORDER BY.   -  person Craig Ringer    schedule 26.03.2014


Ответы (3)


Используя оконную функцию, вы можете сделать это просто так:

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;
person ntalbs    schedule 26.03.2014

Намного проще и быстрее:

(
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
);

Да, вы можете использовать LIMIT и OFFSET для отдельных частей запроса UNION. Просто используйте скобки. Подробности:
Объединение двух операторов SQL SELECT на том же столе

Убедитесь, что у вас есть индекс для population, чтобы сделать это очень быстрым для больших таблиц.

И используйте UNION ALL, так как вы не хотите складывать дубликаты. Быстрее и фактически правильнее.

person Erwin Brandstetter    schedule 26.03.2014

Найденное решение:

(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);

Все, что мне было нужно, это скобки...

person Max Mansour    schedule 26.03.2014