sql >> Database teknologi >  >> RDS >> PostgreSQL

Hvordan forbinder man naturligt de to forespørgsler, der har med klausul?

Du er over at komplicere tingene. Du behøver ikke at slutte dig til disse to forespørgsler (og bør virkelig holde dig væk fra en naturlig deltage), du behøver kun at kombinere dem. min() og max() kan bruges i den samme forespørgsel, er det ikke nødvendigt at køre to forespørgsler for at evaluere begge.

Du behøver heller ikke at indlejre CTE-definitioner, du kan bare skrive den ene efter den anden.

Så noget i stil med dette:

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;

Betingelsen and t1.sum_q in (t2.min_q, t2.max_q) kunne også skrives som and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q) .

Ovenstående kan yderligere forenkles ved at kombinere group by med vinduefunktioner og lav beregningen af ​​sum, min og max i en enkelt forespørgsel:

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. Sådan opretter du forbindelse til mysql ved hjælp af ipv6 fra wordpress

  2. Sådan øges den tilladte vedhæftede filstørrelse, når du sender e-mail i SQL Server (T-SQL)

  3. mysql udløser simulering af påstande

  4. Mysql-php hvordan man implementerer forbindelsespulje med php v 5.2 og ingen vedvarende forbindelse tilladt