デフォルトのRANGE / ROWS
FIRST_VALUE
の場合 (他の分析関数と同様に)BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW
。
IGNORE NULLS
を追加した場合 、次にNULL
範囲を作成するときに値は考慮されません。
RANGE
BETWEEEN UNBOUNDED PRECEDING AND CURRENT ROW EXCEPT FOR THE NULL ROWS
になります (有効なOVER
ではありません 条項)。
txt
以降 NULL
である id
が高い の場合、最初に選択され、NULL
以外のコードがないため、範囲は空です。 それらとUNBOUNDED PRECEDING
の間の行
ORDER BY
のいずれかを変更する必要があります またはRANGE
クエリの句。
ORDER BY
の変更 NULL
の行を配置します IDはウィンドウの最後にあるため、NULL
以外 値(存在する場合)が常に最初に選択され、RANGE
確実にその値から開始します:
with t
as (
select 450 id, null txt , 3488 id_usr from dual union all
select 449 , null , 3488 from dual union all
select 79 , 'A' , 3488 from dual union all
select 78 , 'X' , 3488 from dual
)
select id
, txt
, id_usr
, first_value(txt) over (partition by id_usr order by NVL2(TXT, NULL, id) DESC) first_one
from t
RANGE
の変更 NULL
以外のすべてを含むように範囲を再定義します パーティション内の行:
with t
as (
select 450 id, null txt , 3488 id_usr from dual union all
select 449 , null , 3488 from dual union all
select 79 , 'A' , 3488 from dual union all
select 78 , 'X' , 3488 from dual
)
select id
, txt
, id_usr
, first_value(txt IGNORE NULLS) over (partition by id_usr order by id DESC RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING) first_one
from t