SQL получает строку и выполняет другой запрос

#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 мс. (В приведенном выше примере намного больше объединений и вложенных запросов)