PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como unir naturalmente as duas consultas com cláusula?


Você está complicando demais as coisas. Você não precisa juntar essas duas consultas (e deve ficar longe de um natural join), você só precisa combiná-los. min() e max() pode ser usado dentro da mesma consulta, não há necessidade de executar duas consultas para avaliar ambas.

Você também não precisa aninhar definições de CTE, você pode simplesmente escrever uma após a outra.

Então algo assim:
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;

A condição and t1.sum_q in (t2.min_q, t2.max_q) também pode ser escrito como and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q) .

O acima pode ser simplificado ainda mais combinando group by com funções de janela e faça o cálculo da soma, min e max em uma única consulta:
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;