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 回答