2016-08-28 3 views
0

Как вы выбрали 10 записей городов для каждой страны, заказанных по идентификатору, чтобы запрос был как можно быстрее в базе данных Oracle?Выбор 10 записей городов по каждой стране

Это мой стол:

ID 
CITY_NAME 
COUNTRY_NAME 
SIZE 

В результате я хотел бы видеть (упростить, я показываю только два города для каждой страны):

133 LONDON ENGLAND 10 
132 SHIRE ENGLAND 2 
44 BERLIN GERMANY 10 
43 MUNICH GERMANY 
+0

Какие 10 городов? Каковы ваши критерии для их выбора? – Alejandro

+0

ID - 10 последних вставленных городов – michealAtmi

ответ

0

это улавливает города на основе ID колонка

WITH CTE 
AS 
(SELECT 
ID, 
CITY_NAME, 
COUNTRY_NAME, 
SIZE, 
ROW_NUMBER() OVER (PARTITION BY COUNTRY ORDER BY ID) AS ROWNUM 
FROM TABLE 
) 
SELECT * FROM CTE WHERE ROWNUM<=10; 

Performance с функцией окна является линейным ..

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

почти все страны имеют более 20-50 городов, и вы хотите только топ-10, с нужными индексами, ниже запроса (psuedo) может превзойти запрос, который использует функции окна.

select id,country,size from table1 t1 
cross apply(select top 10 city from table2 t2 where t1.country=t2.country); 
+1

В Oracle (и в общем случае SQL) символ завершения термина ';' должен быть в конце ** оператора **, а не в начале –

+0

Ответчик хочет, чтобы запрос был бы таким же быстрым насколько это возможно. Действительно ли этот запрос является самым быстрым, и если да, то почему вы так тонко? Могли бы вы объяснить ? – krokodilko

+0

@krokodilko: обновлено на основе имеющихся данных – TheGameiswar

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