PostgreSQL
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> PostgreSQL

Làm thế nào để kết hợp tự nhiên hai truy vấn có mệnh đề với?

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()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;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Doctrine2 không đặt trình tự thành mặc định cho cột id (postgres)

  2. Làm thế nào để làm mới các thực thể JPA khi cơ sở dữ liệu phụ trợ thay đổi không đồng bộ?

  3. Loại dữ liệu thích hợp để lưu trữ múi giờ là gì?

  4. Cách hoạt động của hàm Ln () trong PostgreSQL

  5. Postgresql regex để khớp với chữ hoa, nhận biết Unicode