sql >> Database >  >> RDS >> PostgreSQL

Hoe kan ik de twee queries natuurlijk samenvoegen met een clausule?

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;



  1. intervallen van niet-veranderende waarde ophalen uit een reeks getallen

  2. Hoe NHibernate te gebruiken met zowel MySQL-server als Microsoft SQL-server 2008

  3. Python Login Multi-oplossing

  4. Verwerking van gelijktijdige updates in de slaapstand