【问题标题】:rank a column with out ordering in oracle在oracle中对没有排序的列进行排名
【发布时间】:2020-02-21 02:33:50
【问题描述】:

我有如下数据,当我通过排序 id 列应用 dense_rank 时,我根据整数的顺序获得排名,但我需要在运行查询时显示记录时进行排名:

来自查询的数据:

Rid   id

8100  161
8101   2
8102   2
8103   2
8104  156

当我通过 id 对 order 应用 dense_rank 时,我得到了

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

【问题讨论】:

  • 您使用的查询会有很大帮助。此外,表结构会有所帮助。干杯!
  • @VBokšić 感谢回复,添加查询。
  • 你试过了吗:“(按Rid,id排序)”?我看那也没用。对不起...
  • 是的,它只是增加行数,每行加 1

标签: sql oracle rank analytic-functions


【解决方案1】:

我已经根据您的需要调整了解决方案:DENSE_RANK according to particular order

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

这是调整后的代码和演示:

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

【讨论】:

  • 不客气。很高兴能提供任何帮助。请检查我从中建立答案的链接。它有一些解释,也许你可以投票赞成:)干杯!
【解决方案2】:

您可以在第一个查询中从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

【讨论】:

  • 感谢您的回答,但我将结果集作为表格输出,无法在查询中进行硬编码
  • 不客气@Siva,但我看不到任何硬编码。
  • 我的意思是select 8100,161 from dual这部分,我得到8100,161作为查询的结果
  • @Siva - WITH 子查询只是作为伪造表的一种方式而存在。这是本网站和其他论坛上的常用技术,以使响应者无需编写create tableinsertdrop table 语句。它不影响解决方案的有效性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-03
  • 1970-01-01
  • 1970-01-01
  • 2019-02-17
  • 1970-01-01
相关资源
最近更新 更多