Как получить значения против самого старого поля даты в Oracle - PullRequest
0 голосов
/ 27 августа 2018

У меня есть запрос на выборку, который принимает значения из нескольких таблиц с датой в качестве одного из полей:

select e.id,e.date,d.d_id
from emp e, d_source d
 where e.d_id = d.d_id and e.emp_id = 100` 

Для каждого emp_id существует 2 или более записей. Я должен выбрать id из таблицы emp против самого старого значения даты. Существуют случаи, когда значения поля даты равны нулю, или значения поля даты одинаковы для всех выбранных записей. В таком случае мне нужно выбрать идентификатор, связанный с конкретной таблицей d_id (скажем, 123) из d_source.

То, что я до сих пор пробовал, это

`select e.id from emp e 
where e.emp_id = 100 
and e.date=(select min(date) from emp where emp_id = 100)`

Это некоторые результаты первого запроса на выборку для трех различных emp_id-

.

Выберите результаты

Итак, мне нужно вернуть только «id» записи, имеющей самое старое значение даты, и если значения полей даты равны или пусты, мне нужно вернуть «id» записи, у которой d_id равен 456

Любая помощь будет оценена.

1 Ответ

0 голосов
/ 27 августа 2018

Вот пример, основанный на том, что я понял.

SQL> -- sample data
SQL> with emp (emp_id, id, cdate, d_id) as
  2    (select 100, 11111, date '2010-02-26', 123 from dual union all
  3     select 100, 22222, date '2018-02-26', 456 from dual union all
  4     --
  5     select 200, 11122, date '2010-02-26', 123 from dual union all
  6     select 200, 22211, date '2010-02-26', 456 from dual union all
  7     --
  8     select 300, 11133, null, 123 from dual union all
  9     select 300, 22244, null, 456 from dual
 10    ),
 11  source (d_id) as
 12    (select 123 from dual union all
 13     select 456 from dual
 14    )
 15  -- query that, hopefully, returns result you need
 16  select emp_id, id, cdate, d_id
 17  from (select e.emp_id, e.id, e.cdate, d.d_id,
 18          row_number() over (partition by e.emp_id order by e.cdate, d.d_id desc) rn
 19        from emp e join source d on e.d_id = d.d_id
 20       )
 21  where rn = 1
 22  order by emp_id;

    EMP_ID         ID CDATE            D_ID
---------- ---------- ---------- ----------
       100      11111 26/02/2010        123
       200      22211 26/02/2010        456
       300      22244                   456

SQL>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...