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

Trả về các bản ghi khác biệt trên một cột nhưng sắp xếp theo cột khác

DISTINCT ON

Nếu bạn sử dụng DISTINCT ON , bạn cần một truy vấn con cho điều đó:

SELECT *
FROM  (
   SELECT DISTINCT ON (conversation_id) *
   FROM   message t
   ORDER  BY conversation_id, created_at DESC
   ) sub
ORDER BY created_at DESC;

Thứ tự trong truy vấn con phải đồng ý với các cột trong DISTINCT ON , vì vậy bạn phải bọc nó trong một truy vấn bên ngoài để đạt được thứ tự sắp xếp mong muốn.

Thay thế bằng row_number()

Câu chuyện tương tự, bạn cũng cần một truy vấn phụ:

SELECT id, sender_id, receiver_id, conversation_id, subject, body, created_at
FROM  (
   SELECT *, row_number() OVER (PARTITION BY conversation_id
                                ORDER BY created_at DESC) AS rn
   FROM   message t
   ) sub
WHERE  rn = 1
ORDER  BY created_at DESC;

Cũng có thể chậm hơn.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm mới các chế độ xem cụ thể hóa:Đồng tiền, hành vi giao dịch

  2. nhóm theo phạm vi giá

  3. GitHub Actions:Cách kết nối với Postgres trong GithHub Actions

  4. Chọn hàng đầu tiên trong mỗi nhóm GROUP BY?

  5. Làm cách nào để chèn nhiều giá trị vào bảng postgres cùng một lúc?