2014-03-26 1 views
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 (по одному в каждом выбрать).

Любая идея, что я могу сделать, чтобы решить мою проблему? Примечание: Im использованием Postgres

+2

Гораздо лучше реализовано использование 'OFFSET 1 LIMIT 1' и' ORDER BY'. –

ответ

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 
+0

Излишне запутанный. Вы можете быть заинтересованы в моем ответе. –

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

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

0

Much проще и быстрее:

(
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 запроса. Просто используйте круглые скобки. Реквизиты:
Combining two SQL SELECT statements on the same table

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

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