为每个国家选择10个城市记录

Selecting 10 cities records for each country

如何select每个国家/地区的 10 个城市记录按 ID 排序,以便在 Oracle 数据库中查询尽可能快?

这是我的 table:

ID
CITY_NAME
COUNTRY_NAME
SIZE

我希望看到的结果(为简化起见,我只显示每个国家/地区的两个城市):

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

这会根据 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;

window 函数的性能是线性的..

还有一种使用交叉应用的选项,如果您的数据以以下方式分布,它的性能会更好...

几乎所有国家/地区都有超过 20-50 个城市,您只需要前 10 个具有正确索引的查询(伪)可以胜过使用 window 函数的查询..

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