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

时间:2017-03-30 09:11:33

标签: oracle oracle12c

我确实需要实现一个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以这种方式定义行号吗?

由于 Venkat

2 个答案:

答案 0 :(得分:2)

您需要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()不会跳过排名。

答案 1 :(得分:1)

你也可以使用它,但我忘了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