Выберите максимальное значение из всех предыдущих строк (oracle sql) - PullRequest
1 голос
/ 28 января 2020

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

personid  opendate  fraud
       1  20190105      0
       1  20190715      1
       1  20191011      0
       5  20181205      0
       5  20190105      0
       5  20190705      1

Я хочу получить максимальное значение fraud до каждой даты , сгруппированной по personid. То есть я хочу получить следующую таблицу:

personid  opendate  fraud  ever_fraud
       1  20190105      0           0  <-  no preceding frauds yet
       1  20190715      1           1  <-  fraud committed
       1  20191011      0           1  <-  fraud committed in previous credit
       5  20181205      0           0
       5  20190105      0           0
       5  20190705      1           1

Ответы [ 2 ]

2 голосов
/ 28 января 2020

Вы можете использовать функции окна:

select 
    t.*,
    max(fraud) over(partition by personid order by opendate) ever_fraud
from mytable t

Демонстрация на DB Fiddle :

PERSONID | OPENDATE | FRAUD | EVER_FRAUD
-------: | -------: | ----: | ---------:
       1 | 20190105 |     0 |          0
       1 | 20190715 |     1 |          1
       1 | 20191011 |     0 |          1
       5 | 20181205 |     0 |          0
       5 | 20190105 |     0 |          0
       5 | 20190705 |     1 |          1
1 голос
/ 28 января 2020

Похоже на предложение lag() analyti c функция:

with t2 as
(
select t.*,
       lag(fraud,1,0) over (partition by personid order by opendate) as ever_fraud0
  from t
)
select personid, opendate, fraud,
       case when fraud = 1 then fraud else ever_fraud0 end as ever_fraud
  from t2

Демо

...