【问题标题】:How to use DENSE_RANK and order by aditional column?如何使用 DENSE_RANK 并按附加列排序?
【发布时间】:2022-01-19 23:35:23
【问题描述】:

例如,我正在尝试使用 dense_rank 来获取元素顺序:

我有带数据的表 seq_test:

create table seq_test (sequence number, role_name varchar2(20));

insert into seq_test values (10, 'B');
insert into seq_test values (20, 'A');

select DENSE_RANK() over (order by role_name) as seq
     , role_name
     , sequence
    from seq_test
    order by sequence 

运行上面的代码后,我得到了:

SEQ   ROLE_NAME SEQUENCE
2     B         10
1     A         20

我想实现:

SEQ   ROLE_NAME SEQUENCE
1     B         10
2     A         20

所以 DENSE_RANK() 函数使用它自己在函数定义中定义的顺序,我需要按顺序列对 SEQ 列进行排序。

更新:

我想得到:

seq role_name sequence
1   B         10
2   C         15
2   C         15
3   A         25
3   A         30

【问题讨论】:

  • 如果你需要SEQSEQUENCE排序,那么密集秩函数为什么要按ROLE_NAME排序呢?应通过SEQUENCE 订购。抱歉,这个问题没有多大意义。
  • 你的密集排名不是(order by role_name desc)吗?以及为什么dense_rank... row_number() 在给定数据的情况下似乎可以工作我看不到给定样本数据dense_rank 的原因。

标签: sql oracle analytic-functions


【解决方案1】:

试试这个查询:

select DENSE_RANK() over (order by SEQUENCE) as seq
 , role_name
 , sequence
from seq_test;

结果:

seq role_name sequence
  1 B               10
  2 A               20

【讨论】:

  • 谢谢,但我需要使用 role_name 并为重复的 role_names 获得相同的“SEQ”
【解决方案2】:

由于传统的ORDER BY子句是在analytic processing之后执行的。因此,SELECT 语句的 ORDER BY 子句将始终优先于行的顺序,因为它们由 分析函数处理 em>。

在您的情况下,ORDER BY sequence 会覆盖来自 分析函数ORDER BY role_name

顺便说一句,你需要什么取决于 最后一条评论可以通过添加额外的 MIN() 分析函数来解决,例如

SELECT DENSE_RANK() OVER (ORDER BY seq) AS seq, role_name, sequence
  FROM
  (
   SELECT MIN(sequence) OVER (PARTITION BY role_name ) AS seq,
          role_name, sequence
     FROM seq_test
  ) t 

Demo

【讨论】:

  • 谢谢!我想为重复的角色名称获得相同的值
  • 是的,它有效,但我想以 10 的序列显示“B”作为第一行。我在循环中使用 select 语句,所以顺序很重要
  • 类似这样的东西:dbfiddle.uk/… 但是,我需要获取第一行的 seq 1 :)
  • 我有很多重复值,想法是使用序列作为顺序为重复值获取相同的 SEQ
  • B 应该排在最前面,或者其他带有 min(sequence) 的值
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-02-20
  • 2020-02-17
相关资源
最近更新 更多