main.sql 25 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763
  1. do $$
  2. begin
  3. /*
  4. Скрипт создания информационной базы данных
  5. Согласно технического задания https://git.hostfl.ru/VolovikovAlex/Study2025
  6. Редакция 2025-02-12
  7. Edit by valex
  8. */
  9. /*
  10. 1. Удаляем старые элементы
  11. ======================================
  12. */
  13. raise notice 'Запускаем создание новой структуры базы данных meteo';
  14. begin
  15. -- Связи
  16. alter table if exists public.measurment_input_params
  17. drop constraint if exists measurment_type_id_fk;
  18. alter table if exists public.employees
  19. drop constraint if exists military_rank_id_fk;
  20. alter table if exists public.measurment_baths
  21. drop constraint if exists measurment_input_param_id_fk;
  22. alter table if exists public.measurment_baths
  23. drop constraint if exists emploee_id_fk;
  24. -- Таблицы
  25. drop table if exists public.measurment_input_params;
  26. drop table if exists public.measurment_baths;
  27. drop table if exists public.employees;
  28. drop table if exists public.measurment_types;
  29. drop table if exists public.military_ranks;
  30. drop table if exists public.measurment_settings;
  31. -- Нумераторы
  32. drop sequence if exists public.measurment_input_params_seq;
  33. drop sequence if exists public.measurment_baths_seq;
  34. drop sequence if exists public.employees_seq;
  35. drop sequence if exists public.military_ranks_seq;
  36. drop sequence if exists public.measurment_types_seq;
  37. end;
  38. raise notice 'Удаление старых данных выполнено успешно';
  39. /*
  40. 2. Добавляем структуры данных
  41. ================================================
  42. */
  43. -- Справочник должностей
  44. create table military_ranks
  45. (
  46. id integer primary key not null,
  47. description character varying(255)
  48. );
  49. insert into military_ranks(id, description)
  50. values(1,'Рядовой'),(2,'Лейтенант');
  51. create sequence military_ranks_seq start 3;
  52. alter table military_ranks alter column id set default nextval('public.military_ranks_seq');
  53. -- Пользователя
  54. create table employees
  55. (
  56. id integer primary key not null,
  57. name text,
  58. birthday timestamp ,
  59. military_rank_id integer
  60. );
  61. insert into employees(id, name, birthday,military_rank_id )
  62. values(1, 'Воловиков Александр Сергеевич','1978-06-24', 2);
  63. create sequence employees_seq start 2;
  64. alter table employees alter column id set default nextval('public.employees_seq');
  65. -- Устройства для измерения
  66. create table measurment_types
  67. (
  68. id integer primary key not null,
  69. short_name character varying(50),
  70. description text
  71. );
  72. insert into measurment_types(id, short_name, description)
  73. values(1, 'ДМК', 'Десантный метео комплекс'),
  74. (2,'ВР','Ветровое ружье');
  75. create sequence measurment_types_seq start 3;
  76. alter table measurment_types alter column id set default nextval('public.measurment_types_seq');
  77. -- Таблица с параметрами
  78. create table measurment_input_params
  79. (
  80. id integer primary key not null,
  81. measurment_type_id integer not null,
  82. height numeric(8,2) default 0,
  83. temperature numeric(8,2) default 0,
  84. pressure numeric(8,2) default 0,
  85. wind_direction numeric(8,2) default 0,
  86. wind_speed numeric(8,2) default 0,
  87. bullet_demolition_range numeric(8,2) default 0
  88. );
  89. insert into measurment_input_params(id, measurment_type_id, height, temperature, pressure, wind_direction,wind_speed )
  90. values(1, 1, 100,12,34,0.2,45);
  91. create sequence measurment_input_params_seq start 2;
  92. alter table measurment_input_params alter column id set default nextval('public.measurment_input_params_seq');
  93. -- Таблица с историей
  94. create table measurment_baths
  95. (
  96. id integer primary key not null,
  97. emploee_id integer not null,
  98. measurment_input_param_id integer not null,
  99. started timestamp default now()
  100. );
  101. insert into measurment_baths(id, emploee_id, measurment_input_param_id)
  102. values(1, 1, 1);
  103. create sequence measurment_baths_seq start 2;
  104. alter table measurment_baths alter column id set default nextval('public.measurment_baths_seq');
  105. -- Таблица с настройками
  106. create table measurment_settings
  107. (
  108. key character varying(100) primary key not null,
  109. value character varying(255) ,
  110. description text
  111. );
  112. insert into measurment_settings(key, value, description)
  113. values('min_temperature', '-10', 'Минимальное значение температуры'),
  114. ('max_temperature', '50', 'Максимальное значение температуры'),
  115. ('min_pressure','500','Минимальное значение давления'),
  116. ('max_pressure','900','Максимальное значение давления'),
  117. ('min_wind_direction','0','Минимальное значение направления ветра'),
  118. ('max_wind_direction','59','Максимальное значение направления ветра'),
  119. ('calc_table_temperature','15.9','Табличное значение температуры'),
  120. ('calc_table_pressure','750','Табличное значение наземного давления'),
  121. ('min_height','0','Минимальная высота'),
  122. ('max_height','400','Максимальная высота');
  123. raise notice 'Создание общих справочников и наполнение выполнено успешно';
  124. /*
  125. 3. Подготовка расчетных структур
  126. ==========================================
  127. */
  128. drop table if exists calc_temperatures_correction;
  129. create table calc_temperatures_correction
  130. (
  131. temperature numeric(8,2) primary key,
  132. correction numeric(8,2)
  133. );
  134. insert into public.calc_temperatures_correction(temperature, correction)
  135. Values(0, 0.5),(5, 0.5),(10, 1), (20,1), (25, 2), (30, 3.5), (40, 4.5);
  136. drop type if exists interpolation_type;
  137. create type interpolation_type as
  138. (
  139. x0 numeric(8,2),
  140. x1 numeric(8,2),
  141. y0 numeric(8,2),
  142. y1 numeric(8,2)
  143. );
  144. drop type if exists input_params cascade;
  145. create type input_params as
  146. (
  147. height numeric(8,2),
  148. temperature numeric(8,2),
  149. pressure numeric(8,2),
  150. wind_direction numeric(8,2),
  151. wind_speed numeric(8,2),
  152. bullet_demolition_range numeric(8,2)
  153. );
  154. raise notice 'Расчетные структуры сформированы';
  155. /*
  156. 4. Создание связей
  157. ==========================================
  158. */
  159. begin
  160. alter table public.measurment_baths
  161. add constraint emploee_id_fk
  162. foreign key (emploee_id)
  163. references public.employees (id);
  164. alter table public.measurment_baths
  165. add constraint measurment_input_param_id_fk
  166. foreign key(measurment_input_param_id)
  167. references public.measurment_input_params(id);
  168. alter table public.measurment_input_params
  169. add constraint measurment_type_id_fk
  170. foreign key(measurment_type_id)
  171. references public.measurment_types (id);
  172. alter table public.employees
  173. add constraint military_rank_id_fk
  174. foreign key(military_rank_id)
  175. references public.military_ranks (id);
  176. end;
  177. raise notice 'Связи сформированы';
  178. /*
  179. 4. Создает расчетные и вспомогательные функции
  180. ==========================================
  181. */
  182. -- Функция для расчета отклонения приземной виртуальной температуры
  183. drop function if exists public.fn_calc_header_temperature;
  184. create function public.fn_calc_header_temperature(
  185. par_temperature numeric(8,2))
  186. returns numeric(8,2)
  187. language 'plpgsql'
  188. as $BODY$
  189. declare
  190. default_temperature numeric(8,2) default 15.9;
  191. default_temperature_key character varying default 'calc_table_temperature' ;
  192. virtual_temperature numeric(8,2) default 0;
  193. deltaTv numeric(8,2) default 0;
  194. var_result numeric(8,2) default 0;
  195. begin
  196. raise notice 'Расчет отклонения приземной виртуальной температуры по температуре %', par_temperature;
  197. -- Определим табличное значение температуры
  198. Select coalesce(value::numeric(8,2), default_temperature)
  199. from public.measurment_settings
  200. into virtual_temperature
  201. where
  202. key = default_temperature_key;
  203. -- Вирутальная поправка
  204. deltaTv := par_temperature +
  205. public.fn_calc_temperature_interpolation(par_temperature => par_temperature);
  206. -- Отклонение приземной виртуальной температуры
  207. var_result := deltaTv - virtual_temperature;
  208. return var_result;
  209. end;
  210. $BODY$;
  211. -- Функция для формирования даты в специальном формате
  212. drop function if exists public.fn_calc_header_period;
  213. create function public.fn_calc_header_period(
  214. par_period timestamp with time zone)
  215. RETURNS text
  216. LANGUAGE 'sql'
  217. COST 100
  218. VOLATILE PARALLEL UNSAFE
  219. RETURN ((((CASE WHEN (EXTRACT(day FROM par_period) < (10)::numeric) THEN '0'::text ELSE ''::text END || (EXTRACT(day FROM par_period))::text) || CASE WHEN (EXTRACT(hour FROM par_period) < (10)::numeric) THEN '0'::text ELSE ''::text END) || (EXTRACT(hour FROM par_period))::text) || "left"(CASE WHEN (EXTRACT(minute FROM par_period) < (10)::numeric) THEN '0'::text ELSE (EXTRACT(minute FROM par_period))::text END, 1));
  220. -- Функция для расчета отклонения наземного давления
  221. drop function if exists public.fn_calc_header_pressure;
  222. create function public.fn_calc_header_pressure
  223. (
  224. par_pressure numeric(8,2))
  225. returns numeric(8,2)
  226. language 'plpgsql'
  227. as $body$
  228. declare
  229. default_pressure numeric(8,2) default 750;
  230. table_pressure numeric(8,2) default null;
  231. default_pressure_key character varying default 'calc_table_pressure' ;
  232. begin
  233. raise notice 'Расчет отклонения наземного давления для %', par_pressure;
  234. -- Определяем граничное табличное значение
  235. if not exists (select 1 from public.measurment_settings where key = default_pressure_key ) then
  236. Begin
  237. table_pressure := default_pressure;
  238. end;
  239. else
  240. begin
  241. select value::numeric(18,2)
  242. into table_pressure
  243. from public.measurment_settings where key = default_pressure_key;
  244. end;
  245. end if;
  246. -- Результат
  247. return par_pressure - coalesce(table_pressure,table_pressure) ;
  248. end;
  249. $body$;
  250. -- Функция для проверки входных параметров
  251. drop function if exists public.fn_check_input_params(numeric(8,2), numeric(8,2), numeric(8,2), numeric(8,2), numeric(8,2), numeric(8,2));
  252. create function public.fn_check_input_params(
  253. par_height numeric(8,2),
  254. par_temperature numeric(8,2),
  255. par_pressure numeric(8,2),
  256. par_wind_direction numeric(8,2),
  257. par_wind_speed numeric(8,2),
  258. par_bullet_demolition_range numeric(8,2)
  259. )
  260. returns public.input_params
  261. language 'plpgsql'
  262. as $body$
  263. declare
  264. var_result public.input_params;
  265. begin
  266. -- Температура
  267. if not exists (
  268. select 1 from (
  269. select
  270. coalesce(min_temperature , '0')::numeric(8,2) as min_temperature,
  271. coalesce(max_temperature, '0')::numeric(8,2) as max_temperature
  272. from
  273. (select 1 ) as t
  274. cross join
  275. ( select value as min_temperature from public.measurment_settings where key = 'min_temperature' ) as t1
  276. cross join
  277. ( select value as max_temperature from public.measurment_settings where key = 'max_temperature' ) as t2
  278. ) as t
  279. where
  280. par_temperature between min_temperature and max_temperature
  281. ) then
  282. raise exception 'Температура % не укладывает в диаппазон!', par_temperature;
  283. end if;
  284. var_result.temperature = par_temperature;
  285. -- Давление
  286. if not exists (
  287. select 1 from (
  288. select
  289. coalesce(min_pressure , '0')::numeric(8,2) as min_pressure,
  290. coalesce(max_pressure, '0')::numeric(8,2) as max_pressure
  291. from
  292. (select 1 ) as t
  293. cross join
  294. ( select value as min_pressure from public.measurment_settings where key = 'min_pressure' ) as t1
  295. cross join
  296. ( select value as max_pressure from public.measurment_settings where key = 'max_pressure' ) as t2
  297. ) as t
  298. where
  299. par_pressure between min_pressure and max_pressure
  300. ) then
  301. raise exception 'Давление % не укладывает в диаппазон!', par_pressure;
  302. end if;
  303. var_result.pressure = par_pressure;
  304. -- Высота
  305. if not exists (
  306. select 1 from (
  307. select
  308. coalesce(min_height , '0')::numeric(8,2) as min_height,
  309. coalesce(max_height, '0')::numeric(8,2) as max_height
  310. from
  311. (select 1 ) as t
  312. cross join
  313. ( select value as min_height from public.measurment_settings where key = 'min_height' ) as t1
  314. cross join
  315. ( select value as max_height from public.measurment_settings where key = 'max_height' ) as t2
  316. ) as t
  317. where
  318. par_height between min_height and max_height
  319. ) then
  320. raise exception 'Высота % не укладывает в диаппазон!', par_height;
  321. end if;
  322. var_result.height = par_height;
  323. -- Напрвление ветра
  324. if not exists (
  325. select 1 from (
  326. select
  327. coalesce(min_wind_direction , '0')::numeric(8,2) as min_wind_direction,
  328. coalesce(max_wind_direction, '0')::numeric(8,2) as max_wind_direction
  329. from
  330. (select 1 ) as t
  331. cross join
  332. ( select value as min_wind_direction from public.measurment_settings where key = 'min_wind_direction' ) as t1
  333. cross join
  334. ( select value as max_wind_direction from public.measurment_settings where key = 'max_wind_direction' ) as t2
  335. )
  336. where
  337. par_wind_direction between min_wind_direction and max_wind_direction
  338. ) then
  339. raise exception 'Направление ветра % не укладывает в диаппазон!', par_wind_direction;
  340. end if;
  341. var_result.wind_direction = par_wind_direction;
  342. var_result.wind_speed = par_wind_speed;
  343. return var_result;
  344. end;
  345. $body$;
  346. -- Функция для проверки параметров
  347. drop function if exists public.fn_check_input_params(input_params);
  348. create function public.fn_check_input_params(
  349. par_param input_params
  350. )
  351. returns public.input_params
  352. language 'plpgsql'
  353. as $body$
  354. declare
  355. var_result input_params;
  356. begin
  357. var_result := fn_check_input_params(
  358. par_param.height, par_param.temperature, par_param.pressure, par_param.wind_direction,
  359. par_param.wind_speed, par_param.bullet_demolition_range
  360. );
  361. return var_result;
  362. end ;
  363. $body$;
  364. -- Функция для расчета интерполяции
  365. drop function if exists public.fn_calc_temperature_interpolation;
  366. create function public.fn_calc_temperature_interpolation(
  367. par_temperature numeric(8,2))
  368. returns numeric
  369. language 'plpgsql'
  370. as $body$
  371. -- Расчет интерполяции
  372. declare
  373. var_interpolation interpolation_type;
  374. var_result numeric(8,2) default 0;
  375. var_min_temparure numeric(8,2) default 0;
  376. var_max_temperature numeric(8,2) default 0;
  377. var_denominator numeric(8,2) default 0;
  378. begin
  379. raise notice 'Расчет интерполяции для температуры %', par_temperature;
  380. -- Проверим, возможно температура совпадает со значением в справочнике
  381. if exists (select 1 from public.calc_temperatures_correction where temperature = par_temperature ) then
  382. begin
  383. select correction
  384. into var_result
  385. from public.calc_temperatures_correction
  386. where
  387. temperature = par_temperature;
  388. end;
  389. else
  390. begin
  391. -- Получим диапазон в котором работают поправки
  392. select min(temperature), max(temperature)
  393. into var_min_temparure, var_max_temperature
  394. from public.calc_temperatures_correction;
  395. if par_temperature < var_min_temparure or
  396. par_temperature > var_max_temperature then
  397. raise exception 'Некорректно передан параметр! Невозможно рассчитать поправку. Значение должно укладываться в диаппазон: %, %',
  398. var_min_temparure, var_max_temperature;
  399. end if;
  400. -- Получим граничные параметры
  401. select x0, y0, x1, y1
  402. into var_interpolation.x0, var_interpolation.y0, var_interpolation.x1, var_interpolation.y1
  403. from
  404. (
  405. select t1.temperature as x0, t1.correction as y0
  406. from public.calc_temperatures_correction as t1
  407. where t1.temperature <= par_temperature
  408. order by t1.temperature desc
  409. limit 1
  410. ) as leftPart
  411. cross join
  412. (
  413. select t1.temperature as x1, t1.correction as y1
  414. from public.calc_temperatures_correction as t1
  415. where t1.temperature >= par_temperature
  416. order by t1.temperature
  417. limit 1
  418. ) as rightPart;
  419. raise notice 'Граничные значения %', var_interpolation;
  420. -- Расчет поправки
  421. var_denominator := var_interpolation.x1 - var_interpolation.x0;
  422. if var_denominator = 0.0 then
  423. raise exception 'Деление на нуль. Возможно, некорректные данные в таблице с поправками!';
  424. end if;
  425. var_result := (par_temperature - var_interpolation.x0) * (var_interpolation.y1 - var_interpolation.y0) / var_denominator + var_interpolation.y0;
  426. end;
  427. end if;
  428. return var_result;
  429. end;
  430. $body$;
  431. -- Функция для генерации случайной даты
  432. drop function if exists fn_get_random_timestamp;
  433. create function fn_get_random_timestamp(
  434. par_min_value timestamp,
  435. par_max_value timestamp)
  436. returns timestamp
  437. language 'plpgsql'
  438. as $body$
  439. begin
  440. return random() * (par_max_value - par_min_value) + par_min_value;
  441. end;
  442. $body$;
  443. -- Функция для генерации случайного целого числа из диаппазона
  444. drop function if exists fn_get_randon_integer;
  445. create function fn_get_randon_integer(
  446. par_min_value integer,
  447. par_max_value integer
  448. )
  449. returns integer
  450. language 'plpgsql'
  451. as $body$
  452. begin
  453. return floor((par_max_value + 1 - par_min_value)*random())::integer + par_min_value;
  454. end;
  455. $body$;
  456. -- Функция для гнерации случайного текста
  457. drop function if exists fn_get_random_text;
  458. create function fn_get_random_text(
  459. par_length int,
  460. par_list_of_chars text DEFAULT 'АБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯабвгдеёжзийклмнопрстуфхцчшщъыьэюяABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz_0123456789'
  461. )
  462. returns text
  463. language 'plpgsql'
  464. as $body$
  465. declare
  466. var_len_of_list integer default length(par_list_of_chars);
  467. var_position integer;
  468. var_result text = '';
  469. var_random_number integer;
  470. var_max_value integer;
  471. var_min_value integer;
  472. begin
  473. var_min_value := 10;
  474. var_max_value := 50;
  475. for var_position in 1 .. par_length loop
  476. -- добавляем к строке случайный символ
  477. var_random_number := fn_get_randon_integer(var_min_value, var_max_value );
  478. var_result := var_result || substr(par_list_of_chars, var_random_number ,1);
  479. end loop;
  480. return var_result;
  481. end;
  482. $body$;
  483. -- Функция для расчета метео приближенный
  484. drop function if exists fn_calc_header_meteo_avg;
  485. create function fn_calc_header_meteo_avg(
  486. par_params input_params
  487. )
  488. returns text
  489. language 'plpgsql'
  490. as $body$
  491. declare
  492. var_result text;
  493. var_params input_params;
  494. begin
  495. -- Проверяю аргументы
  496. var_params := public.fn_check_input_params(par_params);
  497. select
  498. -- Дата
  499. public.fn_calc_header_period(now()) ||
  500. --Высота расположения метеопоста над уровнем моря.
  501. lpad( 340::text, 4, '0' ) ||
  502. -- Отклонение наземного давления атмосферы
  503. lpad(
  504. case when coalesce(var_params.pressure,0) < 0 then
  505. '5'
  506. else ''
  507. end ||
  508. lpad ( abs(( coalesce(var_params.pressure, 0) )::int)::text,2,'0')
  509. , 3, '0') as "БББ",
  510. -- Отклонение приземной виртуальной температуры
  511. lpad(
  512. case when coalesce( var_params.temperature, 0) < 0 then
  513. '5'
  514. else
  515. ''
  516. end ||
  517. ( coalesce(var_params.temperature,0)::int)::text
  518. , 2,'0')
  519. into var_result;
  520. return var_result;
  521. end;
  522. $body$;
  523. raise notice 'Структура сформирована успешно';
  524. end $$;
  525. -- Проверка расчета
  526. do $$
  527. declare
  528. var_pressure_value numeric(8,2) default 0;
  529. var_temperature_value numeric(8,2) default 0;
  530. var_period text;
  531. var_pressure text;
  532. var_height text;
  533. var_temperature text;
  534. begin
  535. var_pressure_value := public.fn_calc_header_pressure(743);
  536. var_temperature_value := public.fn_calc_header_temperature(23);
  537. select
  538. -- Дата
  539. public.fn_calc_header_period(now()) as "ДДЧЧМ",
  540. --Высота расположения метеопоста над уровнем моря.
  541. lpad( 340::text, 4, '0' ) as "ВВВВ",
  542. -- Отклонение наземного давления атмосферы
  543. lpad(
  544. case when var_pressure_value < 0 then
  545. '5'
  546. else ''
  547. end ||
  548. lpad ( abs((var_pressure_value)::int)::text,2,'0')
  549. , 3, '0') as "БББ",
  550. -- Отклонение приземной виртуальной температуры
  551. lpad(
  552. case when var_temperature_value < 0 then
  553. '5'
  554. else
  555. ''
  556. end ||
  557. (var_temperature_value::int)::text
  558. , 2,'0') as "TT"
  559. into
  560. var_period, var_height, var_pressure, var_temperature;
  561. raise notice '==============================';
  562. raise notice 'Пример расчета метео приближенный';
  563. raise notice ' ДДЧЧМ %, ВВВВ %, БББ % , TT %', var_period, var_height, var_pressure, var_temperature;
  564. end $$;
  565. -- Генерация тестовых данных
  566. do $$
  567. declare
  568. var_position integer;
  569. var_emploee_ids integer[];
  570. var_emploee_quantity integer default 5;
  571. var_min_rank integer;
  572. var_max_rank integer;
  573. var_emploee_id integer;
  574. var_current_emploee_id integer;
  575. var_index integer;
  576. var_measure_type_id integer;
  577. var_measure_input_data_id integer;
  578. begin
  579. -- Определяем макс дипазон по должностям
  580. select min(id), max(id)
  581. into var_min_rank,var_max_rank
  582. from public.military_ranks;
  583. -- Формируем список пользователей
  584. for var_position in 1 .. var_emploee_quantity loop
  585. insert into public.employees(name, birthday, military_rank_id )
  586. select
  587. fn_get_random_text(25), -- name
  588. fn_get_random_timestamp('1978-01-01','2000-01-01'), -- birthday
  589. fn_get_randon_integer(var_min_rank, var_max_rank) -- military_rank_id
  590. ;
  591. select id into var_emploee_id from public.employees order by id desc limit 1;
  592. var_emploee_ids := var_emploee_ids || var_emploee_id;
  593. end loop;
  594. raise notice 'Сформированы тестовые пользователи %', var_emploee_ids;
  595. -- Формируем для каждого по 100 измерений
  596. foreach var_current_emploee_id in ARRAY var_emploee_ids LOOP
  597. for var_index in 1 .. 100 loop
  598. var_measure_type_id := fn_get_randon_integer(1,2);
  599. insert into public.measurment_input_params(measurment_type_id, height, temperature, pressure, wind_direction, wind_speed)
  600. select
  601. var_measure_type_id,
  602. fn_get_randon_integer(0,600)::numeric(8,2), -- height
  603. fn_get_randon_integer(0, 50)::numeric(8,2), -- temperature
  604. fn_get_randon_integer(500, 850)::numeric(8,2), -- pressure
  605. fn_get_randon_integer(0,59)::numeric(8,2), -- ind_direction
  606. fn_get_randon_integer(0,59)::numeric(8,2) -- wind_speed
  607. ;
  608. select id into var_measure_input_data_id from measurment_input_params order by id desc limit 1;
  609. insert into public.measurment_baths( emploee_id, measurment_input_param_id, started)
  610. select
  611. var_current_emploee_id,
  612. var_measure_input_data_id,
  613. fn_get_random_timestamp('2025-02-01 00:00', '2025-02-05 00:00')
  614. ;
  615. end loop;
  616. end loop;
  617. raise notice 'Набор тестовых данных сформирован успешно';
  618. end $$;