powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Исправить функцию
3 сообщений из 3, страница 1 из 1
Исправить функцию
    #38986046
Фотография lena_ki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PostgreSQL 8.3
В базе данных есть таблица, куда устройства присылают свои показатели.
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
CREATE TABLE sensdatas
(
  idserial serial NOT NULL,
  id integer NOT NULL,-- номер устройства
  temperature double precision,-- для функции myparam 0 температура
  pressure double precision,-- для функции myparam 1 давление
  humidity double precision,-- для функции myparam 2 влажность
  sernum integer NOT NULL,
  curenttime timestamp without time zone NOT NULL,
  et integer,
  ep integer,
  eh integer,
  iroom character varying(64),
  CONSTRAINT sensdataskey PRIMARY KEY (idserial)
)


Одно устройство присылает данные каждые 20 секунд, другое каждое 60 секунд и т.д.
Допустим, пользователь хочет посмотреть данные по температуре за сутки от устройства, которое шлет данные каждые 20 секунд. Получается, что на клиент надо передать большое кол-во данных, а если пользователь захочет посмотреть за месяц, то кол-во данных вообще огромное.
Хотелось бы, например, иметь на клиенте возможность передать на сервер параметр, например, 1 час. Тогда, если требуются данные за сутки, то сервер должен вернуть 24 показателя. Где каждый показатель это среднее значение, которое рассчиталось на сервере по каждому часу.
Как исправить функцию ниже? Она не правильная, не получаю нужные данные.

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
CREATE OR REPLACE FUNCTION public.f_myfunc(
  date1 timestamptz,
  date2 timestamptz,
  interv VARCHAR,
  device INTEGER,
  myparam INTEGER -- 0, 1, 2
)
RETURNS SETOF record AS
$body$
DECLARE
params record;
date_int TIMESTAMP;
BEGIN
date_int=date1;
 
WHILE date_int <= date2 LOOP--цикл по интервалу с шагом "interv"
 
 FOR params IN 
 --выводим среднее значение за "шаг"
IF myparam=0 THEN
 SELECT s.id, s.sernum, avg(s.temperature), date_int FROM sensdatas s
 WHERE s.id=device AND s.curenttime BETWEEN date_int AND date_int + interv::INTERVAL 
 GROUP BY s.id, s.sernum, date_int
 ORDER BY date_int 
 
ELSIF myparam=1 THEN
 SELECT s.id, s.sernum, avg(s.pressure), date_int FROM sensdatas s
 WHERE s.id=device AND s.curenttime BETWEEN date_int AND date_int + interv::INTERVAL 
  GROUP BY s.id, s.sernum, date_int
 ORDER BY date_int
 
ELSIF myparam=2 THEN
 SELECT s.id, s.sernum, avg(s.humidity), date_int FROM sensdatas s
 WHERE s.id=device AND s.curenttime BETWEEN date_int AND date_int + interv::INTERVAL
 GROUP BY s.id, s.sernum, date_int 
 ORDER BY date_int 
 
END IF;
 
 LOOP
 RETURN NEXT params;
 END LOOP;
 
 date_int:=date_int+ interv::INTERVAL;--продвигаемся по интервалу шагом "interv"
 
END LOOP;
 
RETURN;
END;
$body$
LANGUAGE 'plpgsql'
VOLATILE
 
RETURNS NULL ON NULL INPUT
SECURITY INVOKER
COST 100 ROWS 1000;
 
--пример вызова. 3 это номер датчика. 0 это температура
SELECT * FROM f_myfunc(to_timestamp('01.05.2015 10:00:00','dd.mm.yyyy HH24:MI:SS'),
to_timestamp('28.05.2015 16:00:00','dd.mm.yyyy HH24:MI:SS'),'1 hour',3,0)AS(id INTEGER, sernum INTEGER,
pokazateli DOUBLE PRECISION, date_int TIMESTAMP)



Спасибо.
...
Рейтинг: 0 / 0
Исправить функцию
    #38986089
p2.
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lena_ki,

поделить, откруглить, сгруппировать - на всю функцию один запрос return query.
от myparam отказаться за ненадобностью, интервал передавать как интервал.
...
Рейтинг: 0 / 0
Исправить функцию
    #38988678
Alex Marmuzevich
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
3 сообщений из 3, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Исправить функцию
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]