我有一张表格,列出与患者相关的文件。一些文档将带有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
有没有办法做到这一点?
答案 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