#postgresql #sql-function
#postgresql #sql-функция
Вопрос:
Мне нужна функция sql для вычисления данных из разных таблиц.
Есть две таблицы,
tbl_moving
|-----------------------------|
| start_datetime | value |
|-----------------------------|
| 2016-10-05 10:00:00 | 23 |
| 2016-10-05 10:10:00 | 24 |
|-----------------------------|
tbl_execution
|-----------------------------|
| executed_datetime | value |
|-----------------------------|
| 2016-10-05 10:05:00 | true |
| 2016-10-05 10:16:00 | false |
|-----------------------------|
Теперь мне нужно вернуть массив со следующими данными:
"tbl_moving"."start_datetime",
"tbl_moving"."value",
"tbl_moving"."stop_datetime" (is the next start_datetime (10:10:00),
"tbl_execution"."value" (where executed_datetime is between "tbl_moving"."start_datetime" and the next start_datetime (10:10:00)
Моя проблема в том, что я не знаю, как получить результат запроса
Что-то вроде
a = SELECT max(start_datetime) as start_datetime FROM "tbl_moving" WHERE value != 0 ORDER BY sig_datetime DESC GROUP BY start_datetime LIMIT 1;
Ответ №1:
Для этого вам не нужна функция, вы можете сделать это с помощью одного запроса:
select m.*, e.value
from (
select m.start_datetime,
lead(m.start_datetime) over (order by m.start_datetime) as stop_datetime,
m.value
from tbl_moving m
) m
join tbl_execution e
on e.start_datetime between m.start_datetime and m.stop_datetime
Комментарии:
1. Потрясающе! Большое спасибо 🙂 Вчера запрос на построение полного объекта для 4000 строк выполнялся ~ 30 секунд. Теперь с вашей строкой
lead(m.start_datetime) over (order by m.start_datetime) as stop_datetime,
я создаю только один запрос со временем выполнения> 700 мс. (В приведенном выше примере намного больше объединений и вложенных запросов)