sql >> Databáze >  >> RDS >> PostgreSQL

Jak mohu získat funkci okna Redshift/Postgresql LAG pro selektivní vyloučení záznamů?

Přístup, který mě napadl, byl místo toho zacílit na jednotlivé záznamy, které by měly být označeny jako TRUE . Zvažte toto:

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;

Zdá se, že tento dotaz funguje v níže uvedeném demo odkazu Postgres.

Ukázka




  1. Jak opravit:V migraci nezpracovaný dotaz sequelizuje zpětné lomítko reklamy ve varchar, což způsobuje chybu při vkládání této hodnoty do databáze

  2. MYSQL, Max, Seskupit podle a Max

  3. Problém výpočtu týdne Oracle

  4. Pokročilý dotaz Mysql pro získání hlavního záznamu, pokud se dvě podmínky shodují na různých řádcích podřízených záznamů