Browse Source

Правки дз 4

Vsevolod Levitan 1 month ago
parent
commit
83e0381898
1 changed files with 35 additions and 14 deletions
  1. 35 14
      homework/4.sql

+ 35 - 14
homework/4.sql

@@ -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;