Получение последних трех записей

Aleks27
Дата: 17.02.2022 12:02:10
Всем привет. Прошу помощи в получение последних трех записей. Сервер 8 версии.

Есть таблица история должностей, в ней дата начала и дата освобождения, личный номер.

Нужно выбрать последние три записи, исключая текущую, и если в этих трех записях есть должность слушатель курсов, то ее пропускаем и берем следующую.

Последнюю беру так:
Select i.dateBegin, i.dateEnd, i.naimFull
From ist_dlgn i
Where i.ln = :B_MAIN.LN
AND i.dateBegin < (Select MAX(dateBegin) FROM ist_dlgn Where i.ln = :B_MAIN.LN)
AND i.dateBegin = (Select MAX(dateEnd) FROM ist_dlgn Where i.ln = :B_MAIN.LN)

В вышеуказанном варианте выбирается последняя должность перед текущей, при использовании rownum выдаются три первые записи, сортировка не помогает. Прошу помощи!
Заранее благодарен.
Anton_Demin
Дата: 17.02.2022 12:08:51
Aleks27,

select * 
from (/*ваш запрос*/ order by )
where rownum<=3
Stax
Дата: 17.02.2022 12:28:36
Aleks27

исключая текущую


понятие текущей, у каждого свое

раскройте смысл в разрезе dateBegin, dateEnd

.....
stax
Aleks27
Дата: 18.02.2022 05:21:57
Anton_Demin,

Читаем внимательно мое сообщение, сортировка не работает, в вашем варианте тоже.
Aleks27
Дата: 18.02.2022 05:23:20
Stax,

автор
раскройте смысл в разрезе dateBegin, dateEnd

прошлые записи имеют и дату назначения и дату освобождения, текущая должность имеет только дату назначения.
Правильный Вася
Дата: 18.02.2022 06:00:00
Должности могут совмещаться?
Shtirlitz33
Дата: 18.02.2022 08:04:11
Так решение на поверхности и совсем просто в последних версиях с этим стало
with TEST_TAB AS
(
select sysdate-10 dt, 4 id, 'a' from dual UNION
select sysdate-5 dt, 3 id, 'b' from dual UNION
select sysdate dt, 1 id, 'last' from dual UNION
select sysdate-2 dt, 2 id, 'd' from dual UNION
select sysdate-20 dt, 5 id, 'e' from dual
)
select * from TEST_TAB
 ORDER BY DT desc
 OFFSET 1 ROW
 FETCH NEXT 3 ROWS ONLY;


просто order by правильно сделать нужно и все
Stax
Дата: 18.02.2022 09:43:29
Aleks27
Anton_Demin,

Читаем внимательно мое сообщение, сортировка не работает, в вашем варианте тоже.

SQL> ed
Wrote file afiedt.buf

  1  with ist_dlgn (ln,naimFull,dateBegin, dateEnd, pos) as (
  2  select 1,'Aleks27',date '2018-01-01',date '2018-02-01','R' from dual union all
  3  select 1,'Aleks27',date '2018-02-01',date '2019-01-01','R' from dual union all
  4  select 1,'Aleks27',date '2019-01-01',date '2020-02-01','R' from dual union all
  5  select 1,'Aleks27',date '2020-02-01',date '2020-03-01','R' from dual union all
  6  select 1,'Aleks27',date '2020-03-01',date '2020-04-01','K' from dual union all
  7  select 1,'Aleks27',date '2020-04-01',date '2020-05-01','O' from dual union all
  8  select 1,'Aleks27',date '2020-05-01',null,'R' from dual union all
  9  --
 10  select 2,'Stax',date '2021-04-01',date '2021-05-01','O' from dual union all
 11  select 2,'Stax',date '2021-05-01',null,'R' from dual
 12  )
 13  select * from (
 14    select *
 15    from ist_dlgn i
 16    where
 17        ln=1
 18      and dateEnd is not null
 19      and pos<>'K'
 20    order by dateBegin DESC
 21  )
 22  where ROWNUM<=3
 23* order by dateBegin
SQL> /

        LN NAIMFUL DATEBEGIN  DATEEND    P
---------- ------- ---------- ---------- -
         1 Aleks27 01.01.2019 01.02.2020 R
         1 Aleks27 01.02.2020 01.03.2020 R
         1 Aleks27 01.04.2020 01.05.2020 O

SQL>


.....
stax
Aleks27
Дата: 18.02.2022 10:54:28
Правильный Вася,

naimFull - название должности может быть одинаковым, но даты нет.
Aleks27
Дата: 18.02.2022 10:54:57
Shtirlitz33,

Версия сервера 8