在 oracle 中对列进行排序而不进行排序

rank a column with out ordering in oracle

我有如下数据,当我通过排序 id 列应用 dense_rank 时,我根据整数的顺序获得排名,但我需要排名,因为 [=35= 时显示记录] 一个查询:

来自查询的数据:

Rid   id

8100  161
8101   2
8102   2
8103   2
8104  156

当我应用 dense_rank over order by id 然后我得到

Rid   id    rank

8100  161    3
8101   2     1
8102   2     1
8103   2     1
8104  156    2

但我的要求是通过以下方式:

Rid   id    rank

8100  161    1
8101   2     2
8102   2     2
8103   2     2
8104  156    3

也使用了row_number,但结果不如预期,不确定哪种选择更好。

感谢任何帮助。

谢谢

编辑-----------------------------

已使用查询

Select rid, id,dense_rank() over (order by id) row_num
from table

在第一个查询

中从lag()分析函数获取值后,您可以使用包含(order by rid)sum()聚合
with tab( rid,id ) as
(
    select 8100,161 from dual union all              
    select 8101,2   from dual union all              
    select 8102,2   from dual union all              
    select 8103,2   from dual union all              
    select 8104,156 from dual
), t2 as 
   (
   select t.*, lag(id,1,0) over (order by rid) lg
     from tab t
   )
   select rid, id, sum(case when lg!=id then 1 else 0 end) over (order by rid) as row_num
     from t2

Demo

我已经根据您的需要从这里调整了解决方案:

我不确定是否应该将其标记为重复,因为在上面的 link 上没有 ORACLE 标记。如果有更多有经验的会员认为我应该发表评论,我会发表评论并删除此答案。

调整后的代码和demo如下:

SELECT t2.rid
       , t2.id
       , DENSE_RANK() OVER (ORDER BY t2.max_rid)
FROM (
  SELECT MAX(t1.rid) OVER (PARTITION BY t1.grupa) AS max_rid
         , t1.rid
         , t1.id
  FROM (       
    SELECT rid
           , id
           ,ROW_NUMBER() OVER (ORDER BY rid) - ROW_NUMBER() OVER (PARTITION BY id ORDER BY rid) AS grupa
    FROM test_table) t1 )  t2
ORDER BY rid

DEMO