Bạn đang quá phức tạp hóa mọi thứ. Bạn không cần phải tham gia hai truy vấn đó (và thực sự nên tránh xa một tự nhiên tham gia), bạn chỉ cần kết hợp chúng. min()
và max()
có thể được sử dụng bên trong cùng một truy vấn, không cần phải chạy hai truy vấn để đánh giá cả hai.
Bạn cũng không cần phải lồng các định nghĩa CTE, bạn có thể viết lần lượt.
Vì vậy, một cái gì đó như thế này:
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;
Điều kiện and t1.sum_q in (t2.min_q, t2.max_q)
cũng có thể được viết là and (t2.max_q = t1.sum_q or t2.min_q = t1.sum_q)
.
Phần trên có thể được đơn giản hóa hơn nữa bằng cách kết hợp nhóm group by
với chức năng cửa sổ
và thực hiện phép tính tổng, tối thiểu và tối đa trong một truy vấn duy nhất:
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;