Oracle 中一列的前 n 个不同值

Top n distinct values of one column in Oracle

我正在使用一个查询,其中一部分获得特定列的前 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

原来table是这样的:

 col
-----
 a
 a
 a
 b
 b
 b
 c
 d
 d
 e
 f
 f
 f
 f

并且查询 returns 列的前 3 行(不是前 3 行,它只会是 a):

 col
-----
 a
 a
 a
 b
 b
 b
 c

我正在尝试了解是否有更正确的方法来执行此操作,因为实际查询很大并且使用看起来几乎相同的子查询复制其大小只是为了获得前 3 名很难使用和 understand/modify.

有没有更好的方法来处理 Oracle 中一列的前 3 个不同值?

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

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

demo