sql >> データベース >  >> RDS >> PostgreSQL

Redshift / Postgresql LAGウィンドウ関数でレコードを選択的に除外するにはどうすればよいですか?

    私が思いついたアプローチは、代わりにTRUEとしてラベル付けする必要がある個々のレコードをターゲットにすることでした。 。これを考慮してください:

    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;
    

    このクエリは、以下のPostgresデモリンクで機能しているようです。

    デモ




    1. PHPを使用して、テーブルを垂直ではなく水平に印刷する

    2. 列名に追加された引用符をExcelから削除するimportSQLServer 2008

    3. レコードのない時間を含む、1日の時間でグループ化されたレコードを選択する方法

    4. データベースの整合性を確保するためにトランザクションとロックを適切に使用するにはどうすればよいですか?