Je maakt de zaken te ingewikkeld. Je hoeft niet aan die twee zoekopdrachten deel te nemen (en moet echt wegblijven van een natuurlijke join), je hoeft ze alleen maar te combineren. min()
en max()
kan binnen dezelfde query worden gebruikt, het is niet nodig om twee query's uit te voeren om beide te evalueren.
U hoeft ook geen CTE-definities te nesten, u kunt gewoon de een na de ander schrijven.
Dus zoiets als dit:
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;
De voorwaarde and t1.sum_q in (t2.min_q, t2.max_q)
kan ook worden geschreven als and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q)
.
Het bovenstaande kan verder worden vereenvoudigd door group by
. te combineren met vensterfuncties
en bereken de som, min en max in een enkele zoekopdracht:
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;