sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man naturligt sammanfogar de två frågorna som har med klausul?

Du komplicerar saker för mycket. Du behöver inte gå med i dessa två frågor (och bör verkligen hålla dig borta från en naturlig gå med), behöver du bara kombinera dem. min() och max() kan användas i samma fråga, det finns inget behov av att köra två frågor för att utvärdera båda.

Du behöver inte heller kapsla CTE-definitioner, du kan bara skriva en efter en.

Så något sånt här:

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;

Villkoret and t1.sum_q in (t2.min_q, t2.max_q) kan också skrivas som and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q) .

Ovanstående kan ytterligare förenklas genom att kombinera group by med fönsterfunktioner och gör beräkningen av summan, min och max i en enda fråga:

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. Kopiera några av kolumnerna i en csv-fil till en tabell

  2. Beräkna skillnaden mellan två datumtider i MySQL

  3. Fel på ORACLE-utlösaren

  4. Hur man lagrar UTF8-tecken i MySQL