我正在使用查询,查询的一部分获得某一列的前3名。
它将创建该列的唯一子查询,并限制3行,然后将这些行过滤到主查询中以进行前3个查询。
WITH subquery AS (
SELECT col FROM (
SELECT DISTINCT col
FROM tbl
) WHERE ROWNUM <= 3
)
SELECT col
FROM tbl
WHERE tbl.col = subquery.col
原始表格如下:
col
-----
a
a
a
b
b
b
c
d
d
e
f
f
f
f
查询将返回列的前3名(而不是仅a
的前3行):
col
-----
a
a
a
b
b
b
c
我试图了解是否有更正确的方法来执行此操作,因为实际查询很大,并且用看起来几乎相同的子查询来复制它的大小,只是为了获得前三名很难而难以理解/ modify。
在Oracle中是否有更好的方法来处理一列的前3个不同值?
答案 0 :(得分:4)
是的,您可以使用dense_rank
并避免重复的代码:
select col
from (select col, dense_rank() over (order by col) rnk from tbl)
where rnk <= 3