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