Я бы определенно сделал бы это, используя процедуру, поскольку она может быть реализована очень простым способом с использованием циклов. Тем не менее, вы должны быть в состоянии сделать что-то похожее на это:
select car_id, sum(segment_price)
from (
select
car_id,
km_driven,
f,
t,
price,
driven_in_segment,
segment_price
from (
select
car_id,
km_driven,
f,
t,
price,
(coalesce(least(t, km_driven), km_driven) - f) driven_in_segment,
price * (coalesce(least(t, km_driven), km_driven) - f) segment_price
from
-- NOTE: cartesian product here
cars,
pricing
where f < km_driven
)
) data
group by car_id
order by car_id
Я нахожу это менее читабельным, хотя.
UPDATE:
Этот запрос немного сложнее, чем необходимо, я пробовал кое-что с оконными функциями, которые в конце концов не были нужны. Здесь упрощенная версия, которая должна быть эквивалентна:
select car_id, sum(segment_price)
from (
select
car_id,
km_driven,
f,
t,
price,
(coalesce(least(t, km_driven), km_driven) - f) driven_in_segment,
price * (coalesce(least(t, km_driven), km_driven) - f) segment_price
from
-- NOTE: cartesian product here
cars,
pricing
where f < km_driven
) data
group by car_id
order by car_id