■ はじめに
Snowflake で Windows関数を使った際のトラブルシュートをメモ。
【1】トラブル概要
Snowflake で Windows関数「ROW_NUMBER() OVER PARTITION BY」を使った際に 以下「エラー内容」が表示してしまう
1)エラーが発生したSQL
SELECT * FROM ( -- Sub-query SELECT *, ROW_NUMBER() OVER (PARTITION BY XXX, XXXX ORDER BY XXX DESC) AS ROW_NUM FROM ... WHERE ROW_NUM=1 ) AS main ;
【2】エラー内容
Window function [ROW_NUMBER() OVER (PARTITION BY XXX, XXXX ORDER BY XXX DESC NULLS FIRST)] appears outside of SELECT, QUALIFY, and ORDER BY clauses.
【3】エラー原因
* エラーの内容を見ると、Window関数の後ろに Window関数にかかわる変数ROW_NUMを使っていたため
該当部分
WHERE ROW_NUM=1
【4】解決案
* WITH句を使う(別の方法で書き直せるかもしれないが)
WITH句 ~ 共通テーブル式 ~
https://dk521123.hatenablog.com/entry/2012/07/26/013620
1)SQL例
-- [1] Sub-query を WITH句で定義 WITH TEMP_TABLE AS ( SELECT *, ROW_NUMBER() OVER (PARTITION BY XXX, XXXX ORDER BY XXX DESC) AS ROW_NUM FROM ... ) -- [2] WITH句で定義したテーブルから「WHERE ROW_NUM=1」を実行する SELECT * FROM TEMP_TABLE WHERE ROW_NUM=1 ;
関連記事
SQLを書くコツ
https://dk521123.hatenablog.com/entry/2016/01/11/173055
Window関数 ~ 入門編 ~
https://dk521123.hatenablog.com/entry/2023/02/22/000000
Window関数 ~ ROW_NUMBER / RANK + PARTITION BY ~
https://dk521123.hatenablog.com/entry/2021/03/11/210937
Window関数 ~ LAG / LEAD ~
https://dk521123.hatenablog.com/entry/2021/09/10/092850
Window関数 ~ RANK / DENSE_RANK ~
https://dk521123.hatenablog.com/entry/2012/08/15/225233
SQL ~ BETWEEN句 ~
https://dk521123.hatenablog.com/entry/2010/08/06/111640
SQL ~ HAVING句 ~
https://dk521123.hatenablog.com/entry/2010/07/13/154947
SQL ~ IN句 ~
https://dk521123.hatenablog.com/entry/2024/12/01/000000
SQL ~ ORDER BY句 ~
https://dk521123.hatenablog.com/entry/2010/03/18/220719
SQL ~ WITH句 / 共通テーブル式 ~
https://dk521123.hatenablog.com/entry/2012/07/26/013620