Я довольно новичок в Postgres, и я пытаюсь реализовать некоторые сложные функции.
Следующий запрос работает:
select (
select ts as start
from (
select *
from events
where (reason = 'START' or reason = 'STOP')
and ts < ?
and user = ?
order by ts desc
limit 1
) as subquery_start
where reason = 'START'
),(
select ts as stop
from (
select *
from events
where (reason = 'START' or reason = 'STOP')
and ts > ?
and user = ?
order by ts
limit 1
) as subquery_stop
where reason = 'STOP'
);
Он определяет, находится ли пользователь навремя, находится между событиями START и STOP, возвращая:
start | stop
---------------------------+---------------------------
2018-06-01 10:44:55.52+01 | 2018-06-01 10:45:07.52+01
(1 row)
независимо от того, не являются ли они:
start | stop
-------+------
|
(1 row)
или они только после START и более поздней STOP еще нетpresent:
start | stop
---------------------------+------
2018-06-01 10:44:55.52+01 |
(1 row)
Можно ли упростить такой запрос, если я хочу вернуть одну строку, как в приведенных выше примерах?
Будут ли три уровня вложенных выборок вызывать проблемы с производительностью?