powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Cложная хранимая процедура
10 сообщений из 10, страница 1 из 1
Cложная хранимая процедура
    #35474593
Фотография lena_ki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раньше я не писала таких сложных запросов, поэтому не могу придумать его стуктуру:

Устройство, установленное на автомобиле, шлет свои координаты на сервер, и они складируются в базу данных (в одну из таблиц). В этой таблице есть координаты и дата прихода сигнала.
Допустим устройство шлет данные раз в минуту. Значит, в час приходит 60 пакетов, а в сутки 24*60.
Пусть теперь пользователь хочет отобразить положение автомобиля на карте за определенный период времени, например с 1 апреля по 30 апреля. Получается на карте надо отобразить огромное число точек из базы 30*24*60, это мне кажется не правильно. Плюс автомобиль мог стоять, например, сутки на стоянке, поэтому и координаты он будет присылать в эти сутки одни и те же. Это надо как-то предусмотреть и откинуть эти координаты.
Помогите, пожалуйста, составить хранимую процедуру, кторая могла бы выбирать координаты прибора за определенный период (как пример с 1 апреля по 30 апреля) и с определенным интервалом (как пример 1 час)... или можно придумать такой SQL запрос?
Мне кажется хранимая процедура лучше т.к. логика на сервере, но ее код я представляю очень смутно. :(
...
Рейтинг: 0 / 0
Cложная хранимая процедура
    #35474753
v0v4ik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Если вы описали всю область применения, то вам незачем использовать БД вообще. Пишите себе в файлы, разделяйте их, например, по длям и машинам. А откинуть лишние координаты очень просто: надо сравнивать новую координату с предыдушей. Вообще-то, вариантов масса, все зависит от деталей вашей задачи. В любом случае, писать новую координату как запись в БД - не рационально, надо групировать в массивы, полигоны ...
...
Рейтинг: 0 / 0
Cложная хранимая процедура
    #35474776
Фотография Ёш
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
lena_kiПолучается на карте надо отобразить огромное число точек из базы 30*24*60, это мне кажется не правильно. Плюс автомобиль мог стоять, например, сутки на стоянке, поэтому и координаты он будет присылать в эти сутки одни и те же. Это надо как-то предусмотреть и откинуть эти координаты.совсем недавно читал про это, в компьютерре помоему :)
GPS приёмники вычисляют координаты с погрешностью. то есть даже если машина стоит - координаты не будут одними и теми же - они будут плавать, например в виде хаотично разбросанных точек в круге диаметром допустим 50 метров. может быть иногда могут быть даже совсем "левые" координаты, например за орбитой луны %), у меня так градусник мерил температуру на улице: 23.4, 23.7, 25.2, -1.9, 23.3, 23.4 типа такого и с GPS приёмника будет идти
lena_kiПомогите, пожалуйста, составить хранимую процедуру, кторая могла бы выбирать координаты прибора за определенный период (как пример с 1 апреля по 30 апреля) и с определенным интервалом (как пример 1 час)... или можно придумать такой SQL запрос?
Мне кажется хранимая процедура лучше т.к. логика на сервере, но ее код я представляю очень смутно. :(я в математике не силён %) но Вам нужно обрабатывать не "сырые" данные, а уже "сглаженые" (по моему это называется "апроксимация" ?). делать это на лету запросом по моему очень расточительно.

Вам нужно что-то из этого имхо: http://alglib.sources.ru/interpolation/
...
Рейтинг: 0 / 0
Cложная хранимая процедура
    #35474824
Фотография lena_ki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Если вы описали всю область применения, то вам незачем использовать БД вообще.

БД создано с таблицами Автомобиль-Водитель-Прибор. Созданы все связи, типа таблиц прибор_автомобиль (когда установлен и т.п.) и т.п. Есть отдельная таблица куда прибор присылает свои координаты и время. (см.рис.).
Спец.приложение на сервере складирует эти сигналы в таблицу БД. Весь сервеный цикл организован и работает.
Есть мое клиентское приложение. На нем две вкалдки:
1. Показать текущую позицию автомобитля на карте google.
2. Показать маршрут автомобиля за период времени и с заданным временным диапазоном (например 1 час).
Пункт первый реализовала. Просто запрос на получения самой свежей записи для определнного автомобиля, который выбрал пользователь.
Со вторым пунктом не знаю как оформить запрос.:(
...
Рейтинг: 0 / 0
Cложная хранимая процедура
    #35475046
iz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
iz
Гость
Вообще задача довольно интересная и не совсем реляционная. Я бы делал онлайн агрегирование данных, то есть по мере прихода точек усреднял бы их с нужным окном (или несколькими), применял бы нужную логику (например, зависимость от предыдущих координат и т.п.) и складывал бы в соответствующие таблицы. Для подобных целей придуманы потоковые системы управления базами данных -- поищите, например, TelegraphCQ (система на основе PostgreSQL). Либо можно организовать что-нибудь вроде очереди (см. PgQ) опять же с каким-либо усреднением и выбрасыванием точек самого низкого уровня. В любом случае суть проста: не храним все точки, обрабатываем их почти в онлайн и храним только результаты обработки.
...
Рейтинг: 0 / 0
Cложная хранимая процедура
    #35475053
Konstantin~
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
я бы примерно делал так:

1. создатъ view который дает все нужные вам данные для позиционирования авто в данный момент времени
Код: plaintext
CREATE VIEW  avto_position_view AS SELECT FROM .... JOIN ... ORDER BY ..._timestamp 

2. далее создать саму процедуру которая будет выдавать несколько строк из этого view если дано avto_id, период времени и интервал в секундах.
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
CREATE FUNCTION get_avto_position(IN v_avto_id INTEGER, IN v_time_from TIMESTAMP , IN v_time_until TIMESTAMP IN v_period INTEGER) 
RETURNS SETOF avto_position_view AS $BODY$
BEGIN
 --
 -- код хранимой процедуры.
 --
END;
$BODY$
LANGUAGE 'plpgsql' VOLATILE;



3. запрос должен выглядетъ примерно так
Код: plaintext
1.
2.
-- для авто 1 датъ данные по координатам с '2008-08-01 12:00' до '2008-08-03 17:30' с интервалом в 30 мин
SELECT * FROM get_avto_position( 1 ,'2008-08-01 12:00','2008-08-03 17:30', 1800 )

4. Внутри процедуры вычислитъ кол-во интервалов в периоде
Код: plaintext
SELECT ROUND(EXTRACT (EPOCH FROM ('2008-08-03 17:30'::timestamp -'2008-08-01 12:00'::timestamp)) /  1800 )

5. Далее в цикле датъ n SELECT .. FROM avto_postion_view запросов (n= кол-ву интервалов). WHERE ..timestamp <= ... LIMIT 1. Ограничение времени в WHERE элементарно вычислитъ исходя из нального времени, позиции в цикле и величены интервала. Для цикла см. конструкцию RETURN NEXT
...
Рейтинг: 0 / 0
Cложная хранимая процедура
    #35475471
AGG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
AGG
Гость
lena_ki
Пусть теперь пользователь хочет отобразить положение автомобиля на карте за определенный период времени, например с 1 апреля по 30 апреля. Получается на карте надо отобразить огромное число точек из базы 30*24*60, это мне кажется не правильно. Плюс автомобиль мог стоять, например, сутки на стоянке, поэтому и координаты он будет присылать в эти сутки одни и те же. Это надо как-то предусмотреть и откинуть эти координаты.


1. Отображать на карте такое количество точек бессмысленно. Человек просто не сможет разобраться в таком количестве информации.
2. Если человек задает интервал в днях, то и надо выводить информацию в днях. То есть область, где находилась машина. (Будем иметь несколько пересекающихся областей на карте)
3. При масштабировании области, переходить на более мелкий формат данных (часовые, минутные...). При этом нам уже понадобятся данные только внутри дня/часа.

Вот как-то так..
...
Рейтинг: 0 / 0
Cложная хранимая процедура
    #35475492
Фотография lena_ki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Cпасибо, попробую разобраться в написанном коде.

>Если человек задает интервал в днях, то и надо выводить информацию в днях.

Пользователю предоставлется для выбора в клиентском приложении три параметра.
С какого дня, по какой день, временной период (10 минут, 1 час, сутки и т.п.). Такое вот требование...
...
Рейтинг: 0 / 0
Cложная хранимая процедура
    #35475635
Фотография lena_ki
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я тут подумала об одно параметре. :)
Прибор шлет широту, долготу, свой номер, и скорость автомобиля на котором прибор установлен.
Может задействовать эту самую скорость? Раз скорость 0, значит автомобиль стоял и эти координаты можно откинуть? Это поможет облегчить всю логику построения кода?
...
Рейтинг: 0 / 0
Cложная хранимая процедура
    #35477428
konstantin~guest
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
уточню:

в моей схеме запрос отдает клиентскому приложению не все данные за период времени, а только количество данных кратное некому промежутку времени.
Допустим с 1 по 30 апреля с промежутком в один час программе-клиенту будет отдано 30*24 координат точек. Для нахождения данных ХП потребуется ыполнить 30*24 СЕЛЕКТов в цикле.
это в принципе нормально и долно работать очень быстро с условием что данные проиндексированны по времени. Для предотвращения черезмерной нагрузки на сервер баз промежуток времени можно задавать
программно как отношение к периоду.
...
Рейтинг: 0 / 0
10 сообщений из 10, страница 1 из 1
Форумы / PostgreSQL [игнор отключен] [закрыт для гостей] / Cложная хранимая процедура
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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