sql >> Base de Datos >  >> RDS >> PostgreSQL

¿Cómo unir naturalmente las dos consultas que tienen con la cláusula?

Estás complicando demasiado las cosas. No necesita unir esas dos consultas (y realmente debería mantenerse alejado de una natural unirse), solo necesita combinarlos. min() y max() se puede usar dentro de la misma consulta, no es necesario ejecutar dos consultas para evaluar ambas.

Tampoco necesita anidar definiciones de CTE, simplemente puede escribir una tras otra.

Así que algo como esto:

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;

La condición and t1.sum_q in (t2.min_q, t2.max_q) también podría escribirse como and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q) .

Lo anterior se puede simplificar aún más combinando group by con funciones de ventana y haga el cálculo de la suma, min y max en una sola 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;