Принудительно считать нулевые значения более ранними датами с помощью функции row_number - PullRequest
0 голосов
/ 14 мая 2019

У меня есть таблица, в которой перечислены документы, связанные с пациентом. Некоторые документы будут иметь 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 Ответ

2 голосов
/ 14 мая 2019

Все довольно просто: добавьте NULLS LAST в предложение ORDER BY в оконной функции:

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

Вот дБ <> скрипка

...