1

问题:如何分配诸如CC=1WP=2之类的代码并使查询的这一部分获得所需的结果?如果在同一交易日期有多个交易,则应用业务规则。

这是我对Oracle 11g的查询

select tid, 
       cycle,
       apply_no, 
       seq_no, 
       trans_date, 
       trans_type,
       priority
from ( select tid, 
              cycle,
               apply_no, 
               seq_no, 
               trans_date, 
                trans_type,
                rank() over (partition by tid,
                                 order by trans_date desc,seq_no desc) priority
from transactions where tid=1              

当前结果

TID  cycle    apply_no  seq_no trans_date   trans_type  priority
----------------------------------------------------------------
1    201420    2        2       27-NOV-12   WP          1
1    201320    1        1       27-NOV-12   CC          2
1    201420    2        1       16-OCT-12   CC          3

期望的结果

TID  cycle     apply_no seq_no trans_date trans_type  priority
---------------------------------------------------------------
1    201420    2        2      27-NOV-12  CC          1
1    201320    1        1      27-NOV-12  WP          2
1    201420    2        1      16-OCT-12  CC          3

原因:如果 trans_date 相同,则业务规则状态 CC 优先于 WP(不是因为 CC 在 WP 之前排序)。

4

1 回答 1

1

由于您的 trans_type 顺序实际上是按字母顺序排列的,因此您可以在 rank 函数中将其添加到您的 order by 中。但是,为了更清楚,我会使用 decode.. 类似的东西:

with transactions as
(
    select 1 tid, 201420 cycle, 2 apply_no, 2 seq_no, to_date('27-NOV-12','DD-MON-YY') trans_date, 'WP' trans_type from dual union all
    select 1 tid, 201320 cycle, 1 apply_no, 1 seq_no, to_date('27-NOV-12','DD-MON-YY') trans_date, 'CC' trans_type from dual union all
    select 1 tid, 201420 cycle, 2 apply_no, 1 seq_no, to_date('16-OCT-12','DD-MON-YY') trans_date, 'CC' trans_type from dual
)
select tid, 
       cycle,
       apply_no, 
       seq_no, 
       trans_date, 
       trans_type,
       priority
from ( select tid, 
              cycle,
               apply_no, 
               seq_no, 
               trans_date, 
                trans_type,
                rank() over (partition by tid
                                 order by trans_date desc,decode(trans_type,'CC',1,'WP',2,3),seq_no desc) priority
from transactions where tid=1 );

产生:

       TID      CYCLE   APPLY_NO     SEQ_NO TRANS_DATE  TRANS_TYPE   PRIORITY
---------- ---------- ---------- ---------- ----------- ---------- ----------
         1     201320          1          1 27-NOV-2012 CC                  1
         1     201420          2          2 27-NOV-2012 WP                  2
         1     201420          2          1 16-OCT-2012 CC                  3
于 2012-11-29T18:28:37.897 回答