12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879 |
- /*
- 5. Пример скрипты для расчета интерполяции
- ==========================================
- */
-
- do $$
- declare
- var_interpolation interpolation_type;
- var_temperature integer default 22;
- var_result numeric(8,2) default 0;
- var_min_temparure numeric(8,2) default 0;
- var_max_temperature numeric(8,2) default 0;
- var_denominator numeric(8,2) default 0;
- begin
- raise notice 'Расчет интерполяции для температуры %', var_temperature;
- -- Проверим, возможно температура совпадает со значением в справочнике
- if exists (select 1 from public.calc_temperatures_correction where temperature = var_temperature ) then
- begin
- select correction
- into var_result
- from public.calc_temperatures_correction
- where
- temperature = var_temperature;
- end;
- else
- begin
- -- Получим диапазон в котором работают поправки
- select min(temperature), max(temperature)
- into var_min_temparure, var_max_temperature
- from public.calc_temperatures_correction;
- if var_temperature < var_min_temparure or
- var_temperature > var_max_temperature then
- raise exception 'Некорректно передан параметр! Невозможно рассчитать поправку. Значение должно укладываться в диаппазон: %, %',
- var_min_temparure, var_max_temperature;
- end if;
- -- Получим граничные параметры
- select x0, y0, x1, y1
- into var_interpolation.x0, var_interpolation.y0, var_interpolation.x1, var_interpolation.y1
- from
- (
- select t1.temperature as x0, t1.correction as y0
- from public.calc_temperatures_correction as t1
- where t1.temperature <= var_temperature
- order by t1.temperature desc
- limit 1
- ) as leftPart
- cross join
- (
- select t1.temperature as x1, t1.correction as y1
- from public.calc_temperatures_correction as t1
- where t1.temperature >= var_temperature
- order by t1.temperature
- limit 1
- ) as rightPart;
-
- raise notice 'Граничные значения %', var_interpolation;
- -- Расчет поправки
- var_denominator := var_interpolation.x1 - var_interpolation.x0;
- if var_denominator = 0.0 then
- raise exception 'Деление на нуль. Возможно, некорректные данные в таблице с поправками!';
-
- end if;
-
- var_result := (var_temperature - var_interpolation.x0) * (var_interpolation.y1 - var_interpolation.y0) / var_denominator + var_interpolation.y0;
-
- end;
- end if;
- raise notice 'Результат: %', var_result;
- end $$;
|