Как мы можем заглянуть, чтобы найти следующее значение и когда это произошло?

У меня есть таблица аудита, в которой записывается значение каждого поля с отметкой времени изменения. Я хочу написать запрос, который принимает начальное значение для столбца, посмотреть, когда это значение изменилось, и в той же записи дать мне временную метку изменения.

Это возможно?

Я пытался исследовать с помощью функции 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;

1 ответ

Я сделал некоторые предположения о ваших данных, так как вы не предоставили никаких тестовых данных, но, пожалуйста, исправьте, если ошиблись. По сути, я думаю, что поле ранга вызывало странные результаты. Когда я запускаю это, я могу получить ожидаемые результаты (не 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;
Другие вопросы по тегам