Oracle中一列的前n个不同值

时间:2019-07-02 12:18:36

标签: sql oracle oracle11g window-functions

我正在使用查询,查询的一部分获得某一列的前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个不同值?

1 个答案:

答案 0 :(得分:4)

是的,您可以使用dense_rank并避免重复的代码:

select col 
  from (select col, dense_rank() over (order by col) rnk from tbl)
  where rnk <= 3

demo