|
@@ -0,0 +1,59 @@
|
|
|
+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 $$;
|