SQL
with
target as (
select 1 as val union all
select 1 as val union all
select null as val union all
select 2 as val union all
select 3 as val union all
select null as val union all
select 4 as val union all
select 4 as val
)
select
val,
case
when val is null then null
else dense_rank() over (order by val nulls last)
end as dense_rank_val,
from
target
結果
ちょっと補足
構文的にはNULLを無視してランクを採番する方法がないので少しハマったのでメモ。
CASEによる人力判定とnulls lastを使えば何とかできる。
もっとスマートな方法がありましたら教えて下さい。