すのふら

日々の備忘録

RedshiftでのROW_NUMBER()関数のNULL挙動について

仕事していてRedshiftでのROW_NUMBER()関数のNULL挙動ってどうなんだっけと思ったので、メモしておく。
ORDER BYした時のソートでNULLがどうなるかって話。

docs.aws.amazon.com


テストデータについて

ROW_NUMBER()関数のテストとして、PARTITION BYの値はすべて同じ。
ORDER BYにNULLと値が混ざっている状態にした。

select * from schema.test_rownum;

結果
f:id:snofra:20190129181802p:plain

昇順ソート

select 
  column1,
  column2,
  column3,
  ROW_NUMBER() OVER (
    PARTITION BY column1
    ORDER BY column3 ASC
   ) AS row_num
from schema.test_rownum;


結果
f:id:snofra:20190129181417p:plain
NULLが値よりも上位でソートされるので、row_numberはnullが1となる。


降順ソート

select 
  column1,
  column2,
  column3,
  ROW_NUMBER() OVER (
    PARTITION BY column1
    ORDER BY column3 DESC
   ) AS row_num
from schema.test_rownum;

結果
f:id:snofra:20190129181941p:plain 値がNULLよりも上位でソートされるので、row_numberは値が1 となる。

こういう細かいところPostgreSQLOracle DBで若干違ったりするから地味だけどちゃんと確認しないとなー。