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

Làm cách nào để sử dụng chức năng cửa sổ Redshift / Postgresql LAG để loại trừ các bản ghi một cách có chọn lọc?

Cách tiếp cận mà tôi nghĩ đến là thay vào đó nhắm mục tiêu các bản ghi riêng lẻ sẽ được gắn nhãn là TRUE . Hãy xem xét điều này:

WITH cte AS (
    SELECT *,
        ROW_NUMBER() OVER (PARTITION BY phone ORDER BY ts) rn
    FROM notifications n1
    WHERE EXISTS (SELECT 1 FROM notifications n2 WHERE n1.phone = n2.phone AND
                  n2.ts < n1.ts AND n2.status = 'SUB' AND n2.result = 'SUCCESS') AND
          n1.status = 'RENEWAL' AND n1.result = 'SUCCESS'
)

SELECT n1.*,
    CASE WHEN n2.rn = 1 THEN 'TRUE'
         WHEN n2.rn > 1 THEN 'FALSE' END AS is_first_renewal
FROM notifications n1
LEFT JOIN cte n2
    ON n1.phone = n2.phone AND n1.ts = n2.ts;

Truy vấn này dường như đang hoạt động trong liên kết demo của Postgres được cung cấp bên dưới.

Bản trình diễ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. PostgreSQL bigserial &nextval

  2. Ruby on Rails:phải xuất hiện trong mệnh đề GROUP BY hoặc được sử dụng trong một hàm tổng hợp

  3. Phép chia số nguyên trả về 0

  4. Cách tạo cơ sở dữ liệu PostgreSQL

  5. Postgresql - hiệu suất sử dụng mảng trong cơ sở dữ liệu lớn