はじめに
Snowfakeに数多ある便利機能でお気に入りのものを紹介していこうと思います。
今回はクエリやコマンドの結果に対してのクエリ実行です。
他のDBにはなかなかない機能かなと思います。覚えておくと地味に便利です。
概要
Snowflakeではクエリの結果やコマンドの結果に対してさらにクエリを投げて結果の絞り込みや編集をすることができる。
クエリの結果にクエリを投げる
まずは適当にクエリを投げる
SELECT * FROM INFORMATION_SCHEMA.TABLES;
上記の結果に対してさらにSELECTを実行しようと思います。
前回のquery_idの結果セットを呼び出してそれに対するSELECTを行うため、
FROM句にFROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
と指定して
SELECTを行います。LAST_QUERY_ID()の部分はquery_id指定でも構いません。
-- 前回の結果に対してさらにSELECTを実施
SELECT *
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE TABLE_OWNER IS NOT NULL;
イメージをつかんでいただくために簡単なSQLを2回に分けて実行した感じになりましたがここからが応用です。
コマンドの結果にクエリを投げる
通常SQLでは取得ができないもの、例えばパラメータ一覧の結果を出力し、その結果からさらにデフォルトから変更されたパラメータに絞り込む、というのをやってみます。
まずはパラメータ一覧を出力
-- アカウントレベルのパラメータ一覧の表示
SHOW PARAMETERS IN ACCOUNT;
その後、さらにアカウントレベルかつdefaultから変更されたパラメータに絞り込む
(showコマンドの結果はヘッダが小文字なので項目指定の場合は「"」で囲む必要があります。)
-- アカウントレベルのパラメータかつdefaultから変更されたパラメータを表示
SELECT *
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE "value" <> "default" -- デフォルトから変更されているもの
AND "level" = 'ACCOUNT'; -- アカウントレベルのパラメータ
私のアカウントではタイムゾーン(TIMEZONE)とタイムトラベル期間(DATA_RETENTION_IN_DAYS)をデフォルトから変更していたので想定の通りの結果となりました。
おわりに
これを利用すれば上記のようにコマンドの結果の絞り込みやCOPY文の結果をサマリした結果を指定テーブルに保存するなど、SQLだけでは実現できなかったことも一部できるようになるので頭の片隅においておけばいつか幸せになれるときが来るかもしれません。どこかの誰かのお役に立つ日が来ればうれしいです。