如何使用 DENSE_RANK 并按附加列排序?
How to use DENSE_RANK and order by aditional column?
我正在尝试使用 dense_rank 获取元素顺序,例如:
我有 table 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
试试这个查询:
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
由于常规的ORDER BY
子句是在[=之后执行的12=]。因此 ORDER BY
语句的 SELECT 子句将始终优先于来自行顺序的子句它们由 分析函数 .
处理
在你的情况下 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
我正在尝试使用 dense_rank 获取元素顺序,例如:
我有 table 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
试试这个查询:
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
由于常规的ORDER BY
子句是在[=之后执行的12=]。因此 ORDER BY
语句的 SELECT 子句将始终优先于来自行顺序的子句它们由 分析函数 .
在你的情况下 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