2016-11-27 3 views
0

Здравствуйте I'am очень новой для написания SQL, и я пытаюсь найти подходящий способ использовать TOP в Oracle SQL 9:Использование TOP в ORACLE SQL 9

Мой пример:

select * from example e, test t 
where e.id = t.id 
and country = 'USA' 
order by state ASC; 

Что Я пытаюсь сделать, это взять нижнюю 20% моего запроса, но я знаю, что вы не можете использовать TOP. После исследования я до сих пор не нашел ответ. Я знаю, что вам нужно сначала заказать их, но я не уверен, как тогда взять нижнюю 20% (что было бы ТОП с момента заказа ASC)

+1

Если вы новичок в SQL, почему вы используете SQL9, а не, по крайней мере, SQL11? Там могут быть ограничения в стране, но я считаю, что экспресс-выпуск (Oracle 11.2) доступен бесплатно в большинстве мест в мире. Если вы учитесь в школе, а в школе используется SQL9, вы должны возразить против них - они крадут ваши деньги (если вы платите за курс), обучая вас очень старой версии Oracle. – mathguy

+0

Есть ли техника, используемая в 11.2 для этой ситуации? – user2402107

+0

Не для вашей проблемы - аналитические функции, необходимые для решений, уже существовали в 9i. Но я бы все же задал вопрос принципиально. Есть много функций, которые были добавлены в Oracle 10 и еще еще в Oracle 11, и кажется, что они не будут покрыты, если все, что вы узнаете, - это Oracle 9. – mathguy

ответ

1

В целом (например, если вы хотите верхнюю или нижнюю часть 17,2% строк), вы можете использовать row_number() и count() (аналитические функции), чтобы получить результат.

20% проще - вы ищете верхний (или нижний) квинтиль. Для этого вы можете использовать функцию ntile(), например, так:

select [column_names] 
from (
     select e.*, t.*, ntile(5) over (order by state) as nt 
     from ..... etc 
    ) 
where nt = 1; 

подзапрос Ваш запрос. Имена столбцов во внешнем запросе - это то, что вам действительно нужно; вы также можете использовать select *, но это также покажет ntile (который будет 1 во всех рядах).

0

Если сортировка чего-то в порядке ASCending дает нам верхний набор, то, безусловно, сортировка в Порядок DESCending может дать нам нижний набор.

Это решение использует функцию NTILE() для разделения записей на пять ковшей. Первое ведро - это набор, который мы хотим (потому что отсортирован в порядке убывания). Сортировка в порядке возрастания и взятие пятого квинтиля будет иметь тот же результат.

select * from (
    select e.* 
      , t.* 
      , ntile(5) over (order by state desc) nt 
    from example e, test t 
    where e.id = t.id 
    and country = 'USA' 
) 
where nt = 1 
order by state desc 
/

Вы не говорите, каковы ваши критерии сортировки, поэтому я догадался.

+0

Я считаю, что OP хотел получить 20%, поэтому заказываю восходящий и принимающий желательным результатом будет верхний 20% (первый квинтиль). В любом случае, при использовании 'NTILE()' это не имеет значения, это вопрос фильтрации с помощью 'nt = 1' vs' nt = 5'. Критерием «сортировки» было «состояние» (судя по попытке OP и описанию простого языка). Кроме того, похоже, единственная цель предложения ORDER BY заключалась в том, чтобы приблизиться к решению, поэтому он, вероятно, не нужен в полном решении. – mathguy

Смежные вопросы