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

时间:2016-08-28 16:32:57

标签: sql oracle greatest-n-per-group

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

这是我的表:

ID
CITY_NAME
COUNTRY_NAME
SIZE

结果我希望看到(为了简化,我每个国家只显示两个城市):

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

1 个答案:

答案 0 :(得分: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;

窗口函数的性能是线性的..

如果您的数据以下面的方式分发,还有一个选项可以使用交叉申请,这可能会表现得更好......

几乎所有国家/地区都有超过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);