Browse Source

Исправил

Vsevolod Levitan 2 months ago
parent
commit
9b9d2d95dc
2 changed files with 57 additions and 39 deletions
  1. 43 33
      homework/1.sql
  2. 14 6
      homework/2.sql

+ 43 - 33
homework/1.sql

@@ -10,52 +10,53 @@ create table if not exists users (id serial primary key, name varchar(64), rank_
 
 -- Заполняем звания
 if exists(select from ranks limit 1) then
-raise notice 'Ranks values exist';
+	raise notice 'Ranks values exist';
 else
-insert into ranks(name) values ('Рядовой');
-insert into ranks(name) values ('Ефрейтор');
-insert into ranks(name) values ('Младший сержант');
-insert into ranks(name) values ('Сержант');
-insert into ranks(name) values ('Старший сержант');
-insert into ranks(name) values ('Старшина');
-insert into ranks(name) values ('Прапорщик');
-insert into ranks(name) values ('Старший прапорщик');
-insert into ranks(name) values ('Младший лейтенант');
-insert into ranks(name) values ('Лейтенант');
-insert into ranks(name) values ('Старший лейтенант');
-insert into ranks(name) values ('Капитан');
-insert into ranks(name) values ('Майор');
-insert into ranks(name) values ('Подполковник');
-insert into ranks(name) values ('Полковник');
+	insert into ranks(name) values ('Рядовой');
+	insert into ranks(name) values ('Ефрейтор');
+	insert into ranks(name) values ('Младший сержант');
+	insert into ranks(name) values ('Сержант');
+	insert into ranks(name) values ('Старший сержант');
+	insert into ranks(name) values ('Старшина');
+	insert into ranks(name) values ('Прапорщик');
+	insert into ranks(name) values ('Старший прапорщик');
+	insert into ranks(name) values ('Младший лейтенант');
+	insert into ranks(name) values ('Лейтенант');
+	insert into ranks(name) values ('Старший лейтенант');
+	insert into ranks(name) values ('Капитан');
+	insert into ranks(name) values ('Майор');
+	insert into ranks(name) values ('Подполковник');
+	insert into ranks(name) values ('Полковник');
 insert into ranks(name) values ('Генерал майор');
-insert into ranks(name) values ('Генерал лейтенант');
-insert into ranks(name) values ('Генерал полковник');
-insert into ranks(name) values ('Генерал армии');
-insert into ranks(name) values ('Маршал России');
+	insert into ranks(name) values ('Генерал лейтенант');
+	insert into ranks(name) values ('Генерал полковник');
+	insert into ranks(name) values ('Генерал армии');
+	insert into ranks(name) values ('Маршал России');
 end if;
 
 -- Обновляем username(varchar) -> user_id(integer) в measurement_batch
 if exists(select from information_schema.columns where table_name='measurement_batch' and column_name='user_id') then
-raise notice 'user_id column already exists in table measurement_batch';
+	raise notice 'user_id column already exists in table measurement_batch';
 else
-alter table measurement_batch rename column username to user_id;
-delete from measurement_batch cascade;
-alter table measurement_batch alter column user_id type integer using null;
+	alter table measurement_batch rename column username to user_id;
+	delete from measurement_params;
+	delete from measurement_batch;
+	alter table measurement_batch alter column user_id type integer using null;
 end if;
 
 -- Привязываем measurement_batch(user_id) -> users(id)
 if exists(select from information_schema.referential_constraints where constraint_name = 'measurement_batch_user_id_fkey') then
-raise notice 'Foreign key measurement_batch(user_id) -> users(id) exists';
+	raise notice 'Foreign key measurement_batch(user_id) -> users(id) exists';
 else
-alter table measurement_batch add foreign key(user_id) references users(id);
+	alter table measurement_batch add foreign key(user_id) references users(id);
 end if;
 
 -- Заполняем тестовые данные:
 -- -- Пользователь
 if exists(select from users limit 1) then
-raise notice 'Test user exists';
+	raise notice 'Test user exists';
 else
-insert into users(name, rank_id) values ('Левитан Всеволод Романович', (select id from ranks order by id desc limit 1));
+	insert into users(name, rank_id) values ('Левитан Всеволод Романович', (select id from ranks order by id desc limit 1));
 end if;
 
 END $$;
@@ -69,18 +70,27 @@ begin
 
 -- -- Измерение
 if exists(select id from measurement_batch limit 1) then
-raise notice 'Test batch exists';
+	raise notice 'Test batch exists';
 else
-insert into measurement_batch(start_period, user_id, pos_x, pos_y) values (now(), (select id from users limit 1), 69.00, 42.00);
+	insert into measurement_batch(start_period, user_id, pos_x, pos_y) values (now(), (select id from users limit 1), 69.00, 42.00);
 end if;
 
+END$$;
+
+commit;
+
+begin;
+
+do $$
+begin
+
 -- Данные измерения
 if exists(select id from measurement_params limit 1) then 
-raise notice 'Test params exists';
+	raise notice 'Test params exists';
 else
-insert into measurement_params(measurement_type_id, measurement_batch_id, height, temperature, pressure, wind_speed, wind_direction, bullet_speed) values (1, 1, 100, 15, 750, 0, 0, 0);
+	insert into measurement_params(measurement_type_id, measurement_batch_id, height, temperature, pressure, wind_speed, wind_direction, bullet_speed) values ((select id from measurement_types limit 1), (select id from measurement_batch limit 1), 100, 15, 750, 0, 0, 0);
 end if;
 
-END$$;
+end $$;
 
 commit;

+ 14 - 6
homework/2.sql

@@ -28,6 +28,8 @@ begin
 	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;
+
+	if interp.temperature_b is null or interp.temperature_t is null then raise exception ':c'; end if;
 	
 	return interp;
 end;
@@ -40,14 +42,20 @@ begin
 create or replace function calc_adjustment(interp interpolation)
 	returns numeric
 	language plpgsql as $func$
-	declare adjustment numeric;
+	declare
+		adjustment numeric;
+		temp_min numeric;
+		temp_max 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 min(temperature) from temperature_adjustments into temp_min;
+	select max(temperature) from temperature_adjustments into temp_max;
+	
+	if interp.temperature <= temp_min or 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;
+	elseif interp.temperature >= temp_max or interp.temperature_t = interp.temperature or interp.temperature_b is null then
+		select interp.adjustment_t into adjustment;
+	elseif interp.temperature_b = interp.temperature_t then
+		select 0 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;