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

Chỉ giữ lại 5 kết quả tìm kiếm cuối cùng của người dùng trong một bảng

Cú pháp phù hợp được nêu chi tiết trong sách hướng dẫn :

DELETE FROM history_user h
USING (
    SELECT pk_id, row_number() OVER (ORDER BY search_time DESC) AS rn;
    FROM   history_user
    WHERE  user_id = 188
    ) sub
WHERE sub.rn > 5
AND   h.pk_id = sub.pk_id;

Ở đâu pk_id là bất kỳ (kết hợp của) cột nào là duy nhất . Có thể là user_id , search_time trong trường hợp của bạn - hoặc thuận tiện hơn là khóa chính thay thế.

Chỉ cho một đơn lẻ user_id bạn có thể đơn giản hóa thành:

DELETE FROM history_user h
USING (
    SELECT pk_id
    FROM   history_user
    WHERE  user_id = 188
    ORDER  BY search_time DESC
    OFFSET 5
    ) sub
WHERE h.pk_id = sub.pk_id;

Mặt khác, để đối phó với nhiều người dùng cùng một lúc, bạn cần thêm PARTITION BY vào chức năng cửa sổ của bạn:

DELETE FROM history_user h
USING (
    SELECT pk_id, row_number() OVER (PARTITION BY user_id
                                     ORDER BY search_time DESC) AS rn;
    FROM   history_user
    ) sub
WHERE sub.rn > 5
AND   h.pk_id = sub.pk_id;



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Ký tự dòng mới của PostgreSQL

  2. Nhận ngày thứ hai của tuần này ở Postgres?

  3. Làm cách nào để kết nối với máy chủ PostgreSQL qua JDBC trong Android?

  4. SequelizeConnectionError:chứng chỉ tự ký

  5. tạo các ràng buộc duy nhất cho mỗi người dùng