1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859 |
- do $$
- begin
- create table if not exists temperature_adjustments
- (
- id serial primary key,
- temperature numeric,
- adjustment numeric
- );
- if exists(select from temperature_adjustments limit 1) then
- raise notice 'Temperature_adjustments';
- else
- insert into temperature_adjustments(temperature, adjustment)
- values
- (0, 0), (5, 0.5), (10, 1), (15, 1), (20, 1.5), (25, 2), (30, 3.5), (40, 4.5);
- end if;
- if not exists(select from pg_type where typname = 'interpolation') then
- create type interpolation as (temperature_b numeric, temperature_t numeric, adjustment_b numeric, adjustment_t numeric, temperature numeric);
- end if;
- create or replace function calc_interpolation(temp1 numeric)
- returns interpolation
- language plpgsql as $func$
- declare interp interpolation;
- begin
- select temperature_b, temperature_t, adjustment_b, adjustment_t, temp1 as interpolation into interp from
- (select temperature as temperature_b, adjustment as adjustment_b from temperature_adjustments where temperature <= temp1 order by temperature desc limit 1)
- full join
- (select temperature as temperature_t, adjustment as adjustment_t from temperature_adjustments where temperature >= temp1 order by temperature limit 1)
- on true limit 1;
-
- return interp;
- end;
- $func$;
- end $$;
- do $$
- begin
- create or replace function calc_adjustment(interp interpolation)
- returns numeric
- language plpgsql as $func$
- declare adjustment numeric;
- begin
- if interp.temperature_b = interp.temperature_t then
- select 0 into adjustment;
- elseif interp.temperature_b = interp.temperature or interp.temperature_t is null then
- select interp.adjustment_b into adjustment;
- elseif interp.temperature_t = interp.temperature or interp.temperature_b is null then
- select intermp.adjustment_t into adjustment;
- else
- select interp.adjustment_b+((interp.temperature - interp.temperature_b) / (interp.temperature_t - interp.temperature_b)) * (interp.adjustment_t - interp.adjustment_b)
- into adjustment;
- end if;
- return adjustment;
- end;
- $func$;
- end $$;
|