暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 需要基于person_no列的排名

ASKTOM 2019-03-12
226

问题描述

大家好,

我有所有记录都通用的列ord,然后是person_no。这可以重复。
我有一个名为flag的列,它是一个序列。我正在尝试填充一个新列 (NEW_FLAG),该列基本上将根据填充的顺序对person_no进行排名 (基于标志列)
Op应该是这样的

订单人员 _ 无标志NEW_FLAG
2999362 21065699 1 1
2999362 21065699 2 1
2999362 12158176 3 2
2999362 10750089 4 3
2999362 5475332 5 4
2999362 11150508 6 5
2999362 5475332 7 4
2999362 3807718 8 6
2999362 3991003 9 7
2999362 3754090 10 8

你能帮忙吗

专家解答

这里有一种方法来解决这个问题:

-使用first_value查找每个人的第一个标志值
-使用这个计算的第一个标志来排名 () 的结果:
create table test_table (
  ord number, person_no number, flag number
);

insert into test_table values (2999362,3754090,10);
insert into test_table values (2999362,3807718,8);
insert into test_table values (2999362,3991003,9);
insert into test_table values (2999362,5475332,7);
insert into test_table values (2999362,5475332,5);
insert into test_table values (2999362 ,10750089,4);
insert into test_table values (2999362, 11150508,6);
insert into test_table values (2999362, 12158176,3);
insert into test_table values (2999362, 21065699,1);
insert into test_table values (2999362, 21065699,2);

commit;

with first_flags as (
  select t.*,
         first_value ( flag ) over ( 
           partition by person_no order by flag 
         ) fv_flag
  from   test_table t
)
  select ord, person_no,
         rank () over ( 
           order by fv_flag 
         ) rk
  from   first_flags
  order  by flag;

ORD       PERSON_NO   RK   
  2999362    21065699    1 
  2999362    21065699    1 
  2999362    12158176    3 
  2999362    10750089    4 
  2999362     5475332    5 
  2999362    11150508    7 
  2999362     5475332    5 
  2999362     3807718    8 
  2999362     3991003    9 
  2999362     3754090   10 
复制

文章转载自ASKTOM,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论