为每个国家选择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);
如何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);