PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как естествено да се съединят двете заявки с клауза с?

Прекалявате да усложнявате нещата. Не е необходимо да се присъединявате към тези две заявки (и наистина трябва да стоите далеч от естествено присъединяване), трябва само да ги комбинирате. min() и max() може да се използва в една и съща заявка, няма нужда да изпълнявате две заявки, за да оцените и двете.

Също така не е необходимо да влагате CTE дефиниции, можете просто да пишете една след друга.

Така че нещо подобно:

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;

Условието and t1.sum_q in (t2.min_q, t2.max_q) може също да се запише като and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q) .

Горното може допълнително да се опрости чрез комбиниране на group by с прозоречни функции и направете изчислението на сумата, min и max в една заявка:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Експортиране на таблица от база данни на Postgres (на сървър) в csv файл (на локален) в java

  2. PostgreSql:Получаване на странно форматирано времево клеймо с часова зона

  3. PostgreSQL заявка за изброяване на всички имена на таблици?

  4. изберете за актуализация с JDBC?

  5. Събитието ROLLBACK се задейства в postgresql