Postgresql subquery w between

0

Witam,
Mam tabelę w postgresie stworzoną przez:

CREATE TABLE synchronizations (synchronization TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)

Mogę sobie wybrać dwie ostatnie daty synchronizacji:

SELECT synchronization FROM synchronizations ORDER BY synchronization DESC FETCH FIRST 2 ROWS ONLY

I teraz chciałbym użyć tych dwóch wartości w zapytaniu w filtrowaniu z innej tabeli:

CREATE TABLE emails (addressee TEXT NOT NULL, title TEXT NOT NULL, content TEXT NOT NULL, queued TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)

I tutaj się pojawia problem, czy można użyć tego poprzedniego selecta jako sub-selecta w between:

SELECT * FROM emails WHERE queued BETWEEN ... ?

Bo tak się nie da:

SELECT * FROM emails WHERE queued BETWEEN (SELECT synchronization FROM synchronizations ORDER BY synchronization DESC FETCH FIRST 2 ROWS ONLY)

Mogę zrobić tak:

SELECT emails.* FROM emails INNER JOIN (SELECT MIN(synchronization) AS date_start, MAX(synchronization) AS date_end FROM (SELECT synchronization FROM synchronizations ORDER BY synchronization DESC FETCH FIRST 2 ROWS ONLY) AS t1) AS t2 ON emails.queued BETWEEN date_start AND date_end

ale czy można to zrobić krócej?

3

Można ...
a ponieważ w komentarzach mi zarzucono, że nie zadziała to tu masz działające rozwiązanie

with cte as (select s.synchronization date_end, 
                    lead(s.synchronization,1) over (order by s.synchronization desc) start_date 
               from synchronizations s
              order by s.synchronization desc
              limit 1)
select e.* from cte
  join emails e on date_trunc('seconds', e.queued::timestamp) between date_trunc('seconds', cte.start_date::timestamp) and date_trunc('seconds', cte.date_end::timestamp) 
5
select * from emails where (
select quequed between lead(synchronization) over(ORDER BY synchronization DESC) and synchronization  from synchronizations ORDER BY synchronization DESC FETCH FIRST 1 ROWS ONLY
)
0

Dzięki za odpowiedzi.

1 użytkowników online, w tym zalogowanych: 0, gości: 1