Что я хотел бы сделать, так это то, что когда нет соединения для получения комиссий, я хочу использовать значение комиссии в поле fee_calc из последнего значения сборов/3, найденного в таблице. Например, если в таблице b указан месяц 2022-10-01, а в таблице нет доступного квартала, вернитесь к таблице и получите максимальную дату последней записи до 2022-10-01, которая будет 2022-09-30 end_date. Я пытаюсь выполнить запрос и получаю сообщение об ошибке в Snowflake, указывающее на то, что неподдерживаемый тип подзапроса не может быть оценен.
create or replace table tablea (
key varchar(500),
fees varchar(500),
start_date date,
end_date date
)
create or replace table tableb (
key varchar(500),
asofdate date
)
insert into tablea values ('123','100','2022-07-01','2022-09-30'),('345','200','2022-07-01','2022-09-30'),('123','60','2022-04-01','2022-06-30'),('345','60','2022-04-01','2022-06-30')
insert into tableb values ('123','2022-08-01'),('123','2022-09-01'),('123','2022-10-01'),('345','2022-09-01')
select b.key,b.asofdate,
a.fees,a.start_date,a.end_date,
case when a.fees is null then xxx else fees/3 end as fees_calc
from tableb b
left join tablea a on b.key = a.key
and b.asofdate between a.start_date and a.end_date
См. рисунок, выделено то, что мне нужно, логика должна говорить 33,33
Вы можете создать CTE, чтобы сначала убедиться, что таблицы объединены, а затем рассчитать комиссию. Вы можете использовать задержку с игнорированием нулей, чтобы просмотреть предыдущее ненулевое значение в каждом фрейме окна:
with JOINED as
(
select b.key
,b.asofdate
,a.fees
,a.start_date
,a.end_date
from tableb b left join tablea a on b.key = a.key and b.asofdate between a.start_date and a.end_date
)
select *
,case when fees is null then
lag(fees) ignore nulls over (partition by key order by start_date, end_date) / 3
else fees/3 end as fees_calc
from JOINED
;
Можете ли вы обновить свой пост с ожидаемой выходной таблицей?