Postgresql subquery w between

Postgresql subquery w between
PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Witam,
Mam tabelę w postgresie stworzoną przez:

Kopiuj
CREATE TABLE synchronizations (synchronization TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP)

Mogę sobie wybrać dwie ostatnie daty synchronizacji:

Kopiuj
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:

Kopiuj
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:

Kopiuj
SELECT * FROM emails WHERE queued BETWEEN ... ?

Bo tak się nie da:

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

Mogę zrobić tak:

Kopiuj
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?

woolfik
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 1611
3

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

Kopiuj
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) 
Marcin.Miga
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 2794
5
Kopiuj
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
)
PA
  • Rejestracja: dni
  • Ostatnio: dni
  • Postów: 31
0

Dzięki za odpowiedzi.

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.