【Snowflake】エラー「Window function appears outside of SELECT, QUALIFY...」が表示

■ はじめに

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