|
@@ -60,6 +60,8 @@ insert into numeric_constants("key", "value") values ('dtv', 0.3), ('mp', 15.9)
|
|
|
CREATE OR REPLACE FUNCTION calculate_average_deviation(temperature NUMERIC)
|
|
|
RETURNS TABLE(height INT, deviation NUMERIC) AS $$
|
|
|
DECLARE
|
|
|
+ dtv NUMERIC;
|
|
|
+ mp NUMERIC;
|
|
|
t0 NUMERIC;
|
|
|
delta_t NUMERIC;
|
|
|
deviation_value NUMERIC;
|
|
@@ -67,10 +69,22 @@ DECLARE
|
|
|
deviation_unit NUMERIC;
|
|
|
row_data RECORD;
|
|
|
BEGIN
|
|
|
- t0 := temperature + (select value from numeric_constants where key = 'dtv' limit 1);
|
|
|
+ select value into dtv from numeric_constants where key = 'dtv' limit 1;
|
|
|
+ select value into mp from numeric_constants where key = 'mp' limit 1;
|
|
|
+
|
|
|
+ IF dtv IS NULL THEN
|
|
|
+ dtv := 0.3;
|
|
|
+ RAISE NOTICE 'Константа dtv не найдена, использовано значение 0.3';
|
|
|
+ END IF;
|
|
|
+ IF mp IS NULL THEN
|
|
|
+ mp := 15.9;
|
|
|
+ RAISE NOTICE 'Константа mp не найдена, использовано значение 15.9';
|
|
|
+ END IF;
|
|
|
+
|
|
|
+ t0 := temperature + dtv;
|
|
|
raise notice 't0 %', t0;
|
|
|
|
|
|
- delta_t := t0 - (select value from numeric_constants where key = 'mp' limit 1);
|
|
|
+ delta_t := t0 - mp;
|
|
|
delta_t := ROUND(delta_t);
|
|
|
|
|
|
FOR row_data IN SELECT * FROM average_deviations_temperature LOOP
|
|
@@ -93,15 +107,22 @@ BEGIN
|
|
|
END;
|
|
|
$$ LANGUAGE plpgsql;
|
|
|
|
|
|
-
|
|
|
-select
|
|
|
-u.name as "ФИО",
|
|
|
-mr.name as "Должность",
|
|
|
-COUNT(b.id) as "Количество измерений",
|
|
|
-SUM(case validate_measurement(p.temperature, p.pressure, p.wind_direction) when null then 1 else 0 end) as "Количество ошибочных данных"
|
|
|
-from users u
|
|
|
-join ranks mr on u.rank_id = mr.id
|
|
|
-join measurement_batch b on u.id = b.user_id
|
|
|
-join measurement_params p on p.measurement_batch_id = b.id
|
|
|
-group by u.name, mr.name
|
|
|
-order by "Количество ошибочных данных" desc;
|
|
|
+WITH user_measurements AS (
|
|
|
+ SELECT
|
|
|
+ u.name AS "ФИО",
|
|
|
+ mr.name AS "Должность",
|
|
|
+ COUNT(b.id) AS "Количество измерений",
|
|
|
+ SUM(CASE WHEN validate_measurement(p.temperature, p.pressure, p.wind_direction) IS NULL THEN 1 ELSE 0 END) AS "Количество ошибочных данных"
|
|
|
+ FROM users u
|
|
|
+ JOIN ranks mr ON u.rank_id = mr.id
|
|
|
+ JOIN measurement_batch b ON u.id = b.user_id
|
|
|
+ JOIN measurement_params p ON p.measurement_batch_id = b.id
|
|
|
+ GROUP BY u.name, mr.name
|
|
|
+)
|
|
|
+SELECT
|
|
|
+ "ФИО",
|
|
|
+ "Должность",
|
|
|
+ "Количество измерений",
|
|
|
+ "Количество ошибочных данных"
|
|
|
+FROM user_measurements
|
|
|
+ORDER BY "Количество ошибочных данных" DESC;
|