LEAD
もう 1 つのオプションは、 (またはLAG
結果の順序に応じて) のようなウィンドウ関数を使用することです。この例では、ステータスが日付とともに変化したときに行をマークし、結果を並べ替えて、最初の行以外の行を除外します。
with test_data as (
select 1 status, date '2012-07-26' status_date from dual union all
select 1 status, date '2012-07-24' status_date from dual union all
select 1 status, date '2012-07-22' status_date from dual union all
select 2 status, date '2012-07-21' status_date from dual union all
select 2 status, date '2012-07-19' status_date from dual union all
select 1 status, date '2012-07-16' status_date from dual union all
select 0 status, date '2012-07-14' status_date from dual)
select status, as_of
from (
select status
, case when status != lead(status) over (order by status_date desc) then status_date else null end as_of
from test_data
order by as_of desc nulls last
)
where rownum = 1;
補遺:LEAD
およびLAG
関数は、さらに 2 つのパラメーターを受け入れます
:offset
およびdefault
。デフォルトはoffset
1 で、default
デフォルトは null です。デフォルトでは、結果セットの先頭または末尾にいるときに考慮する値を決定できます。ステータスが変更されていない場合、デフォルトが必要です。この例では、ステータス値が期待されるセットの一部ではないと想定しているため、ステータスのデフォルトとして -1 を指定しました。
with test_data as (
select 1 status, date '2012-07-25' status_date from dual union all
select 1 status, date '2012-07-24' status_date from dual union all
select 1 status, date '2012-07-20' status_date from dual)
select status, as_of
from (
select status
, case when status != lead(status,1,-1) over (order by status_date desc) then status_date else null end as_of
from test_data
order by as_of desc nulls last
)
where rownum = 1;
ケース条件 (equals/not equals)、lead 関数の order by 句、および目的のデフォルトをいじって、ニーズを満たすことができます。