PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Comment joindre naturellement les deux requêtes ayant une clause with?

Vous compliquez trop les choses. Vous n'avez pas besoin de joindre ces deux requêtes (et vous devriez vraiment rester à l'écart d'une requête naturelle join), il vous suffit de les combiner. min() et max() peuvent être utilisés dans la même requête, il n'est pas nécessaire d'exécuter deux requêtes pour évaluer les deux.

Vous n'avez pas non plus besoin d'imbriquer les définitions CTE, vous pouvez simplement écrire les unes après les autres.

Donc quelque chose comme ça :

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 condition and t1.sum_q in (t2.min_q, t2.max_q) peut aussi s'écrire and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q) .

Ce qui précède peut encore être simplifié en combinant group by avec fonctions de fenêtre et faire le calcul de la somme, du min et du max en une seule requête :

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;