トップ / ウィンドウ関数

ntile

パーティション内の行を、指定した個数のグループに行数ができるだけ均等になるよう分割する。

SNOWPARK 静的検証のみ

ntile(3).over(window_spec)

POLARS 実行確認済み

((pl.col("v").rank(method="ordinal") - 1) * 3 // pl.col("v").count()).over("grp")

挙動・設計の違い

Snowflake公式ドキュメントは「順序付けされたデータセットを、指定したバケット数で行数が均等になるよう分割する」と明記している=値そのものではなく行の順位(rank)が基準。Polarsには同名の専用関数が無いため、rank(method="ordinal")(1位・2位…と重複無しの順位)を使って同じ計算式を組み立てる必要がある。7行を3グループに分けて実行して確認したところ、両者とも[3,2,2]行ずつに割れる。

移行時の落とし穴

似て非なるqcut(値の分位点で区切る関数)を使うと失敗することがある。実行して確認したところ、値に重複が多いデータ(例:[1,1,1,1,1,1,100]を3分位に分けようとする)では、qcutは分位点の境界値が重複してしまいquantiles are not uniqueというエラーでそもそも実行できない。一方、上記のrankベースの式は値の重複に関係なく常に行数で均等に割れる。「NTILEの代わり」としてqcutを選ぶと、データによっては動かないコードになる。

ウィンドウ関数の他のメソッド

出典・検証情報

Polars 1.36.1 で実行確認 / Snowpark Python SDK 1.51.1 で静的検証(2026-08-30)