Oracle получает строку, в которой значение столбца изменилось - PullRequest
0 голосов
/ 13 сентября 2018

скажем, у меня есть стол, что-то вроде

ID     CCTR    DATE
-----  ------  ----------
1      2C      8/1/2018
2      2C      7/2/2018
3      2C      5/4/2017
4      2B      3/2/2017
5      2B      1/1/2017
6      UC      11/23/2016

Есть и другие поля, но я сделал это проще. Поэтому я создаю запрос, где у меня есть дата в порядке убывания. Я должен был вернуть строку, где произошли изменения в CCTR. Так что в этом случае он вернул бы ID 4. В основном я хочу найти предыдущее значение CCTR, прежде чем оно изменилось, в данном случае с 2B до 2C.

Как мне это сделать? Я пытался гуглить, но не могу найти правильный метод.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вы можете использовать аналитическую функцию first_value для обнаружения изменений в столбце CCTR :

select fv as value, cctr
  from 
(
  with t(ID,CCTR) as
  (
   select 1,'2C' from dual union all
   select 2,'2C' from dual union all
   select 3,'2C' from dual union all
   select 4,'2B' from dual union all
   select 5,'2B' from dual union all
   select 6,'UC' from dual
  ) 
  select id, cctr, first_value(id) over (partition by cctr order by id ) fv
    from t
  order by id
)  
where id = fv;

VALUE  CCTR
-----  ----
  1     2C
  4     2B
  6     UC

Rextester Demo

0 голосов
/ 13 сентября 2018

Вы можете использовать оконную функцию LAG(), чтобы просмотреть предыдущий ряд и сравнить его.Если ваши данные:

create table t2 (
  id number(6),
  cctr varchar2(10),
  date1 date
);

insert into t2 (id, cctr, date1) values (1, '2C', date '2018-08-01');
insert into t2 (id, cctr, date1) values (2, '2C', date '2018-07-02');
insert into t2 (id, cctr, date1) values (3, '2C', date '2017-05-04');
insert into t2 (id, cctr, date1) values (4, '2B', date '2017-03-02');
insert into t2 (id, cctr, date1) values (5, '2B', date '2017-01-01');
insert into t2 (id, cctr, date1) values (6, 'UC', date '2016-11-23');

, тогда запрос будет:

select * from t2 where date1 = (
  select max(date1)
    from (
    select 
      id, date1, cctr, lag(cctr) over(order by date1 desc) as prev
      from t2
    ) x  
    where prev is not null and cctr <> prev
);

Результат:

ID       CCTR        DATE1    
-------  ----------  -------------------
4        2B          2017-03-02 00:00:00  
...