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