0

各フィールドの値を変更のタイムスタンプとともに記録する監査テーブルがあります。列の開始値を取得するクエリを作成し、その値がいつ変更されたかを確認し、同じレコードで変更のタイムスタンプを取得したいと考えています。

これは可能ですか?

私は LEAD() 関数を使用して探索しようとしましたが、これまでのところ階層クエリは役に立ちませんでした。

これが私がLEAD()で試したことです。

 SELECT provider_id,
            sub_address_id,
            flag_practice,
            flag_mailing,

            last_updated_db_date,
            LEAD (
               flag_practice)
            OVER (PARTITION BY provider_id, sub_provider_address_id
                  ORDER BY last_updated_db_date ASC)
               next_flag_practice,
            LEAD (
               flag_mailing)
            OVER (PARTITION BY provider_id, sub_provider_address_id
                  ORDER BY last_updated_db_date ASC)
               next_flag_mailing,

            LEAD (
               last_updated_db_date)
            OVER (
               PARTITION BY provider_id, sub_provider_address_id
               ORDER BY last_updated_db_date ASC)
               next_practice_update_date, --this does not necessarily produce the next update date of the PRACTICE field but rather any update (which i dont want)

            RANK ()
            OVER (PARTITION BY provider_id, sub_provider_address_id
                  ORDER BY last_updated_db_date ASC)
               rnk -- thought it might help in some form later, haven't quite seen how yet
       FROM aud_address
   ORDER BY provider_id, sub_provider_address_id, rnk;
4

1 に答える 1

0

テストデータを提供しなかったため、データについていくつかの仮定を立てましたが、間違っている場合は修正してください。基本的に、ランク フィールドが奇妙な結果を引き起こしていると思います。これを実行すると、期待どおりの結果を得ることができます (複数のプロバイダー ID にわたる last_updated_date ではなく、単一のプロバイダー/サブプロバイダーの組み合わせの場合のみ)。

    WITH aud_address AS (
        SELECT 108 provider_id, 216 sub_provider_address_id, 1 flag_practice, 0 flag_mailing, to_date('01/03/2014','mm/dd/yyyy') last_updated_db_date FROM DUAL
        UNION ALL
        SELECT 108 provider_id, 216 sub_provider_address_id, 0 flag_practice, 0 flag_mailing, to_date('01/06/2014','mm/dd/yyyy') last_updated_db_date FROM DUAL
        UNION ALL
        SELECT 108 provider_id, 253 sub_provider_address_id, 0 flag_practice, 1 flag_mailing, to_date('01/18/2014','mm/dd/yyyy') last_updated_db_date FROM DUAL
        UNION ALL
        SELECT 108 provider_id, 253 sub_provider_address_id, 1 flag_practice, 1 flag_mailing, to_date('01/13/2014','mm/dd/yyyy') last_updated_db_date FROM DUAL
        UNION ALL
        SELECT 136 provider_id, 345 sub_provider_address_id, 1 flag_practice, 0 flag_mailing, to_date('02/13/2014','mm/dd/yyyy') last_updated_db_date FROM DUAL
        UNION ALL
        SELECT 136 provider_id, 321 sub_provider_address_id, 0 flag_practice, 0 flag_mailing, to_date('02/12/2014','mm/dd/yyyy') last_updated_db_date FROM DUAL
        UNION ALL
        SELECT 136 provider_id, 321 sub_provider_address_id, 1 flag_practice, 1 flag_mailing, to_date('02/18/2014','mm/dd/yyyy') last_updated_db_date FROM DUAL
        UNION ALL
        SELECT 136 provider_id, 345 sub_provider_address_id, 0 flag_practice, 1 flag_mailing, to_date('02/17/2014','mm/dd/yyyy') last_updated_db_date FROM DUAL
    )
    SELECT provider_id,
                sub_provider_address_id,
                flag_practice,
                flag_mailing,
                last_updated_db_date,
                LEAD (
                   flag_practice)
                OVER (PARTITION BY provider_id, sub_provider_address_id
                      ORDER BY last_updated_db_date ASC)
                   next_flag_practice,
                LEAD (
                   flag_mailing)
                OVER (PARTITION BY provider_id, sub_provider_address_id
                      ORDER BY last_updated_db_date ASC)
                   next_flag_mailing,

                LEAD (
                   last_updated_db_date)
                OVER (
                   PARTITION BY provider_id, sub_provider_address_id
                   ORDER BY last_updated_db_date ASC)
                   next_practice_update_date
           FROM aud_address
       ORDER BY provider_id, sub_provider_address_id,last_updated_db_date;
于 2014-08-13T16:39:22.717 に答える