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

前の行と次の行に基づいてレコードを削除し、特定の条件に基づいて日付を割り当てる方法

    クエリでエラーが発生した理由は、サブクエリを定義する前に、そこから何を選択するかを指定する必要があるためです。したがって、接頭辞としてselect * fromを付けた場合 有効なクエリだったでしょう。

    これらのorを実行する必要はないことに注意してください inを使用すると、より短く操作できます。 オペレーター。

    また、いくつかの比較を無効にする必要があります(すでにNOTがあるため) )そしてTRUNCで日付を切り捨てます 。

    これが私が提案するクエリです:

    SELECT      TEMP.REG_ID, 
                TEMP.EVENT_TYPE,
                TEMP.EVENT_DATE,
                TEMP.PRODUCT_CD,
                TEMP.TERM_START_DATE,
                CASE WHEN TEMP.EVENT_TYPE IN ('NEW SUBSCRIPTION', 'RENEWAL', 'UPSELL') 
                      AND TEMP.NEXT_EVENT_TYPE = 'CANCELLATION' THEN
                            LEAST(TEMP.TERM_END_DATE, TEMP.NEXT_TERM_END_DATE)
                     ELSE TEMP.TERM_END_DATE
                END AS TERM_END_DATE,
                TEMP.DAYS,
                TEMP.AMT
    FROM    (SELECT     REG_ID, 
                        EVENT_TYPE,
                        EVENT_DATE,
                        PRODUCT_CD,
                        TERM_START_DATE,
                        TERM_END_DATE,
                        DAYS,
                        AMT,
                        LAG(EVENT_TYPE, 1, '-') over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as PREV_EVENT_TYPE,
                        LAG(EVENT_DATE, 1) over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as PREV_EVENT_DATE,
                        LEAD(EVENT_TYPE, 1, '-') over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as NEXT_EVENT_TYPE,
                        LEAD(EVENT_DATE, 1) over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as NEXT_EVENT_DATE,  
                        LEAD(TERM_END_DATE, 1) over (
                            PARTITION BY REG_ID, PRODUCT_CD
                            ORDER BY EVENT_DATE, TERM_START_DATE) as NEXT_TERM_END_DATE
                FROM    export_table) TEMP
    WHERE   NOT (TEMP.EVENT_TYPE = 'CANCELLATION' 
                 AND TEMP.PREV_EVENT_TYPE IN ('NEW SUBSCRIPTION', 'RENEWAL', 'UPSELL') 
                 AND TRUNC(TEMP.EVENT_DATE) = TRUNC(TEMP.PREV_EVENT_DATE))
    AND     NOT (TEMP.NEXT_EVENT_TYPE = 'CANCELLATION'
                 AND TEMP.EVENT_TYPE IN ('NEW SUBSCRIPTION', 'RENEWAL', 'UPSELL') 
                 AND TRUNC(TEMP.NEXT_EVENT_DATE) = TRUNC(TEMP.EVENT_DATE))
    

    term_end_dateに注意してください ルール2が適用されるため、レコード6のも変更されます。



    1. PHPで複数の画像の挿入とアップロードを実行するにはどうすればよいですか?

    2. Rails ActiveRecordは、主キーではないid列を処理します

    3. SQL Serverエージェントジョブ(T-SQL)のジョブステップを更新する

    4. Laravel 5.5エラーベーステーブルまたはビューはすでに存在します:1050テーブル'users'はすでに存在します