PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak w naturalny sposób połączyć dwa zapytania z klauzulą?

Nadmiernie komplikujesz sprawy. Nie musisz łączyć tych dwóch zapytań (i naprawdę powinieneś trzymać się z daleka od naturalnego dołącz), wystarczy je połączyć. min() i max() może być użyty w tym samym zapytaniu, nie ma potrzeby uruchamiania dwóch zapytań, aby ocenić oba.

Nie musisz również zagnieżdżać definicji CTE, możesz po prostu pisać jedną po drugiej.

Więc coś takiego:

with quant_table as (
  select month, prod, sum(quant) as sum_q
  from sales 
  group by month, prod
), min_max as (
  select month, max(sum_q) as max_q, min(sum_q) as min_q
  from quant_table 
  group by month 
)
select t1.* 
from quant_table t1
  join min_max t2 
    on t2.month = t1.month 
   and t1.sum_q in (t2.min_q, t2.max_q)
order by month, prod;

Warunek and t1.sum_q in (t2.min_q, t2.max_q) można również zapisać jako and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q) .

Powyższe można jeszcze bardziej uprościć, łącząc group by z funkcjami okien i wykonaj obliczenia sumy, min i max w jednym zapytaniu:

with min_max as (
  select month, prod, 
         sum(quant) as sum_q,
         max(sum(quant)) over (partition by month) as max_q,
         min(sum(quant)) over (partition by month) as min_q
  from sales 
  group by month, prod
)
select month, prod, sum_q
from min_max
where sum_q in (max_q, min_q)
order by month, prod;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak uzyskać najnowszą wiadomość w każdej rozmowie danego użytkownika w SQL?

  2. Jak automatycznie zaktualizować znacznik czasu w PostgreSQL?

  3. Postgres zwraca domyślną wartość, gdy kolumna nie istnieje

  4. Postgres:uzyskaj min, max, zagregowane wartości w jednym wyborze

  5. SQL Znajdź wszystkich bezpośrednich potomków w drzewie