PostgreSQL
 sql >> Baza danych >  >> RDS >> PostgreSQL

Jak mogę uzyskać funkcję okna Redshift/Postgresql LAG, aby selektywnie wykluczać rekordy?

Podejście, które przyszło mi do głowy, polegało na kierowaniu na poszczególne rekordy, które powinny być oznaczone jako TRUE . Rozważ to:

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;

Wygląda na to, że to zapytanie działa w linku demonstracyjnym Postgres podanym poniżej.

Demo




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy te znaki są prawidłowe dla XML?

  2. Problem z accepts_nested_attributes_for w Railsach 5.0.0.beta3, opcja -api

  3. PostgreSQL:42883 Operator nie istnieje:znacznik czasu bez strefy czasowej =tekst

  4. Zaloguj konkretne zapytanie postgresql za pomocą pg-promise

  5. Jak zaokrąglić typ REAL do NUMERYCZNEGO?