基于 oracle 中唯一列值的行号?

row number based on unique column value in oralce?

我确实需要实现一个 oracle sql 来定义如下的行号:

row_num, column1, column2, cloumn3
1, ABC, 123, a1
1, ABC, 125, a2
2, ABD, 123, a3
2, ABD, 124, a4
2, ABD, 125, a5
3, ABE, 123, a1

这里我根据column1的唯一值定义了行号。

谁能帮我写oracle sql 来定义行号?

谢谢 文卡特

您需要 DENSE_RANK() 解析函数:

WITH your_table AS (SELECT 'ABC' col1, 123 col2, 'a1' col3 FROM dual UNION ALL
                    SELECT 'ABC' col1, 125 col2, 'a2' col3 FROM dual UNION ALL
                    SELECT 'ABD' col1, 123 col2, 'a3' col3 FROM dual UNION ALL
                    SELECT 'ABD' col1, 124 col2, 'a4' col3 FROM dual UNION ALL
                    SELECT 'ABD' col1, 125 col2, 'a5' col3 FROM dual UNION ALL
                    SELECT 'ABE' col1, 123 col2, 'a1' col3 FROM dual)
  -- end of subquery mimicking your_table with data in; See SQL below:
SELECT dense_rank() OVER (ORDER BY col1) row_num,
       col1,
       col2,
       col3
FROM   your_table
ORDER BY col1, col2, col3;

   ROW_NUM COL1       COL2 COL3
---------- ---- ---------- ----
         1 ABC         123 a1
         1 ABC         125 a2
         2 ABD         123 a3
         2 ABD         124 a4
         2 ABD         125 a5
         3 ABE         123 a1

DENSE_RANK()RANK() 相似,因为它将为绑定的行分配相同的排名(即,在被排序的列中具有相同值的行 - 在您的情况下为 col1) ,但与 RANK() 不同,DENSE_RANK() 不会跳过排名数字。

你也可以用这个,但是我忘了dense rank。所以Boneist的回答更好。

select rn.row_num , t.* from 
(select column1,row_number() over (order by column1) as row_num from 
(select distinct column1 column1 from tbl23) )rn
inner join tbl23 t
on rn.column1=t.column1