Oracle SQL - возвращает строки, где в текущем месяце есть хотя бы одна строка в группе и в предыдущем месяце произошли изменения в классе - PullRequest
0 голосов
/ 05 декабря 2018

Я пытаюсь вывести строки, которые удовлетворяют следующим условиям:

  • Как минимум одна строка для ClientID должна быть в текущем месяце (интересует только самая последняя строка для Client ID вв этом месяце)
  • Класс в текущем месяце для ClientID отличается от непосредственно предыдущей строки из предыдущего месяца для ClientID

Мои данные могут иметь несколько строк на клиента в месяци меня интересует только последняя строка в месяц для каждого клиента.

Вот пример моих данных:

ID      Client ID  Class    Date
14609   87415      C        04/DEC/18
13859   87415      X        16/AUG/18
11906   87415      C        27/FEB/17
10667   87415      B        23/JAN/17
14538   132595     D        03/DEC/18
14567   141805     C        04/DEC/18
14411   141805     A        27/NOV/18

Желаемый результат, основанный на вышесказанном:

ID      Client ID  Class    Date
14609   87415      C        04/DEC/18
13859   87415      X        16/AUG/18
14567   141805     C        04/DEC/18
14411   141805     A        27/NOV/18

У меня было несколько попыток с нулевым успехом.Любая помощь будет принята с благодарностью.Мои попытки не смогли найти сразу предыдущий ряд.: /

select * from
(
select drh.defaultriskhistid, drh.clientid, cv.description, 
drh.updatetimestamp
from default_risk_history drh 
inner join code_values cv on drh.defaultriskcodeid = cv.codevalueid
where
defaultriskhistid in
(select max(defaultriskhistid) from default_risk_history
group by clientid, ltrim(TO_CHAR(updatetimestamp,'mm-yyyy'),'0'))
) t
where
(
Select count(*) from default_risk_history drh1 where drh1.clientid = 
t.clientid and ltrim(TO_CHAR(drh1.updatetimestamp,'mm-yyyy'),'0') = 
ltrim(TO_CHAR(current_date,'mm-yyyy'),'0')
) >=1
order by clientid, updatetimestamp desc

Ответы [ 2 ]

0 голосов
/ 05 декабря 2018

Похоже, вам нужны две самые последние строки, если они имеют разные классы, а самая последняя находится в текущем месяце.Если так:

select t.*
from (select t.*,
             max(date) over (partition by clientid) as max_date,
             lag(class) over (partition by client_id order by date) as prev_class,
             lead(class) over (partition by client_id order by date) as next_class,
             row_number() over (partition by clientid order by date desc) as seqnum
      from t
     ) t
where max_date >= trunc(sysdate, 'MON') and
      ( (seqnum = 1 and prev_class <> class) or
        (seqnum = 2 and next_class <> class)
      );
0 голосов
/ 05 декабря 2018

Вот один из вариантов:

SQL> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

SQL> with test (client_id, class, datum) as
  2    (select 87415, 'c', date '2018-12-04' from dual union all
  3     select 87415, 'x', date '2018-08-16' from dual union all
  4     select 87415, 'c', date '2017-02-27' from dual union all
  5     select 87415, 'b', date '2017-01-23' from dual union all
  6     --
  7     select 132595, 'd', date '2018-12-03' from dual union all
  8     select 141805, 'c', date '2018-12-04' from dual union all
  9     select 141805, 'a', date '2018-11-27' from dual
 10    ),
 11  inter as
 12    (select client_id,
 13       class,
 14       datum,
 15       lag(class) over (partition by client_id order by datum desc) prev_class,
 16       row_number() over (partition by client_id order by datum desc) rn
 17     from test
 18    )
 19  select client_id, class, datum
 20  from inter
 21  where (class <> prev_class or prev_class is null)
 22    and client_id in (select client_id from inter
 23                      group by client_id
 24                      having max(rn) >= 2
 25                     )
 26    and rn <= 2
 27  order by client_id, datum desc;

 CLIENT_ID C DATUM
---------- - ----------
     87415 c 04.12.2018
     87415 x 16.08.2018
    141805 c 04.12.2018
    141805 a 27.11.2018

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