sql >> Databáze >  >> RDS >> PostgreSQL

Jak přirozeně spojit dva dotazy s klauzulí?

Zbytečně si věci komplikujete. Tyto dva dotazy nemusíte spojovat (a měli byste se opravdu držet dál od přirozeného připojit), stačí je pouze zkombinovat. min() a max() lze použít uvnitř stejného dotazu, není třeba spouštět dva dotazy k vyhodnocení obou.

Také nemusíte vnořovat definice CTE, můžete psát jednu po druhé.

Takže něco takového:

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;

Podmínka and t1.sum_q in (t2.min_q, t2.max_q) lze také zapsat jako and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q) .

Výše uvedené lze dále zjednodušit kombinací group by s funkcemi oken a proveďte výpočet součtu, min a max v jediném dotazu:

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. Zabránit spouštění vložení

  2. Uložené procedury, MySQL a PHP

  3. Oracle SQL – Jak získat odlišné řádky pomocí analytické funkce RANK() nebo DENSE_RANK() nebo ROW_NUMBER()?

  4. MySQL objednává více směrů pomocí FIND_IN_SET