使用row_number函数

时间:2019-05-14 17:14:35

标签: sql oracle oracle12c

我有一张表格,列出与患者相关的文件。一些文档将带有RECEIVED_TIME,而另一些则没有。如果存在,我需要拥有最新的RECEIVED_TIME

我正在使用row_number函数基于SEQ创建一个序列号(RECEIVED_TIME);我将记录限制为SEQ=1

不幸的是,当我需要将null值视为“更早”时,它们被认为比RECEIVED_TIME的“晚”。

SQL:

with

data as
(
  select  v.*
          -- sort the most-recent value first
          ,row_number() over (partition by pat_id order by RECEIVED_TIME desc) SEQ
  from (

         select 'A' PAT_ID, 100 ID, 'Obtain' STATUS, '2019-04-19 00:00:00' RECEIVED_TIME from dual
         union all
         select 'A' PAT_ID, 101 ID, 'Unable to Obtained' STATUS, null RECEIVED_TIME from dual

          union all
         select 'B' PAT_ID, 102 ID, 'Obtained' STATUS, '2019-04-18 00:00:00' RECEIVED_TIME from dual
          union all
         select 'B' PAT_ID, 103 ID, 'Obtained' STATUS, '2019-04-19 00:00:00' RECEIVED_TIME from dual

         union all

         select 'C' PAT_ID, 104 ID, 'Unable to Obtained' STATUS, null RECEIVED_TIME from dual

       ) v
)

select  *
from  data

结果:

PAT_ID,ID,STATUS,RECEIVED_TIME,SEQ
A,101,Unable to Obtained,<NULL>,1  <-- null is 'later'
A,100,Obtain,2019-04-19 00:00:00,2
B,103,Obtained,2019-04-19 00:00:00,1
B,102,Obtained,2019-04-18 00:00:00,2
C,104,Unable to Obtained,<NULL>,1

所需结果:

PAT_ID,ID,STATUS,RECEIVED_TIME,SEQ
A,100,Obtain,2019-04-19 00:00:00,1
A,101,Unable to Obtained,<NULL>,2  <-- null should be 'earlier'
B,103,Obtained,2019-04-19 00:00:00,1
B,102,Obtained,2019-04-18 00:00:00,2
C,104,Unable to Obtained,<NULL>,1

有没有办法做到这一点?

1 个答案:

答案 0 :(得分:2)

这很简单:在窗口函数的ORDER BY子句中添加NULLS LAST:

with data as
(
  select  v.*
          -- sort the most-recent value first
          ,row_number() over (partition by pat_id 
                               order by RECEIVED_TIME desc nulls last) SEQ
  from (    
     select 'A' PAT_ID, 100 ID, 'Obtain' STATUS, '2019-04-19 00:00:00' RECEIVED_TIME from dual union all
     select 'A' PAT_ID, 101 ID, 'Unable to Obtained' STATUS, null RECEIVED_TIME from dual union all
     select 'B' PAT_ID, 102 ID, 'Obtained' STATUS, '2019-04-18 00:00:00' RECEIVED_TIME from dual union all
     select 'B' PAT_ID, 103 ID, 'Obtained' STATUS, '2019-04-19 00:00:00' RECEIVED_TIME from dual union all    
     select 'C' PAT_ID, 104 ID, 'Unable to Obtained' STATUS, null RECEIVED_TIME from dual
           ) v
)    
select  *
from  data

这里是db<>fiddle