Воспользуемся конструкцией max() keep(dense_rank) при написании требуемой функции:
create or replace function fn_account_balance(in_newaccnum in char,
in_balance_date in date)
return number is
v_result number;
begin
select max(balance) keep(dense_rank last order by balance_date)
into v_result
from account_balances
where newaccnum = in_newaccnum
and balance_date <= in_balance_date;
return v_result;
end fn_account_balance;
Проверим результат:
select fn_account_balance('40702840700000003465', to_date('27.06.2012','dd.mm.yyyy')) f_465_27_06,
fn_account_balance('40702840700000003465', to_date('28.06.2012','dd.mm.yyyy')) f_465_28_06,
fn_account_balance('40702840700000003465', to_date('29.06.2012','dd.mm.yyyy')) f_465_29_06,
fn_account_balance('40702840700000003465', to_date('30.06.2012','dd.mm.yyyy')) f_465_30_06,
fn_account_balance('40702840700000003465', to_date('01.07.2012','dd.mm.yyyy')) f_465_01_07,
fn_account_balance('40702840700000003465', to_date('02.07.2012','dd.mm.yyyy')) f_465_02_07,
fn_account_balance('40702280000007003168', to_date('25.06.2012','dd.mm.yyyy')) f_168_25_06,
fn_account_balance('40702280000007003168', to_date('26.06.2012','dd.mm.yyyy')) f_168_26_06,
fn_account_balance('40702280000007003168', to_date('27.06.2012','dd.mm.yyyy')) f_168_27_06,
fn_account_balance('40702280000007003168', to_date('28.06.2012','dd.mm.yyyy')) f_168_28_06,
fn_account_balance('40702280000007003168', to_date('29.06.2012','dd.mm.yyyy')) f_168_29_06,
fn_account_balance('40702280000007003168', to_date('30.06.2012','dd.mm.yyyy')) f_168_30_06
from dual;
Задача. Удаление исторических данных о рейтинге.
Дана таблица истории изменения рейтинга клиентов в скоринговых баллах kk_client_rating(clientname varchar2(100), dt date, rating integer).
Написать оператор delete, который уберет для каждого клиента все рейтинги, кроме последнего по дате.