Snowflake

Streamlit in Snowflake で、セマンティックビューから月次画面を作る

Ryosuke Ishii

一番飯店の Instagram 月次レポートは、いまは社内のデータベースから数字を組み立て、HTML にして出しています。同じ画面を、Snowflake の中だけで作れるかを試しました。使ったのは Streamlit in Snowflake(Snowflake の中で動く Python の画面)と、前に作ったセマンティックビューです。

画面は計算せず、セマンティックビューの指標を名前で引くだけ
画面は計算せず、セマンティックビューの指標を名前で引くだけ

作った画面

画面は3つの段でできています。

  • KPI:投稿数・保存率・月間リーチ・プロフィール訪問・リール本数・フィード本数・保存数・リールの平均視聴時間。目標に届いたかの判定を下に添える
  • 投稿ごと:投稿日時・種類・題・リーチ・保存・いいね・その月のベスト投稿
  • 月ごとの推移:月間リーチと保存率

上で対象の月を選ぶと、全部の段が切り替わります。データは Snowflake の外に出ません。見る人は Snowsight(Snowflake の画面)にログインし、左のメニューの「プロジェクト」→「Streamlit」から開きます。

Snowsight で開いた画面(2026年7月)。KPI と判定、投稿ごとの表、月ごとの推移が並ぶ
Snowsight で開いた画面(2026年7月)。KPI と判定、投稿ごとの表、月ごとの推移が並ぶ

2026年7月は、投稿3本(目標9本に6本不足)、保存率0.36%、月間リーチ823でした。どれも公開している月次レポートと同じ値です。

画面の中で計算しない

画面の数字は、すべてセマンティックビューから `SEMANTIC_VIEW()` で引いています。

def sv(dims, metrics, where):
    d = f"DIMENSIONS {dims}" if dims else ""
    return ses.sql(f"SELECT * FROM SEMANTIC_VIEW({SV} {d} METRICS {metrics} WHERE {where})").to_pandas()

k = sv("", "posts.post_count, posts.post_count_check, posts.monthly_save_rate, "
           "posts.save_rate_judgement, posts.total_reach, posts.reach_judgement", "posts.post_month = '2026-07-01'")

保存率は `monthly_save_rate`、目標の判定は `post_count_check` や `save_rate_judgement` と、指標を名前で呼ぶだけです。画面のプログラムには、保存率の計算式も、目標の本数も書いていません。

こうしておくと、決まりが変わったときに直すのはセマンティックビューの1か所だけです。AI に日本語で聞いたときも、同じ指標を使って答えます。画面と AI の答えが食い違う、ということが起きません。

公開しているレポートと突き合わせる

画面と同じ問い合わせで出した数字を、公開しているレポートの元データと比べました。比べたのは14項目(投稿数・リーチ・保存・いいね・表示回数・保存率・視聴時間など)と、その月のベスト投稿です。

月結果
2026年5・6・7月全項目一致
2026年2〜4月一致しない(当時はデータの取り方が違っていた)
2026年8月以降一致しない(Snowflake への取り込みを止めている)

一致を確かめた5〜7月だけを、画面で選べるようにしました。一致しない月まで出すと、画面の数字とレポートの数字が違う理由を、見る人が知る手段がないためです。

つまずいたところ

作った人以外は、そのままでは開けない

画面を作ったのは作業用のロールです。管理者のロールで開くと「この画面を使う権限がない」と止まりました。見る人のロールに、画面ごとの許可を渡す必要があります。

見る人の役に許可が無いと、アプリの読み込みで止まる
見る人の役に許可が無いと、アプリの読み込みで止まる
GRANT USAGE ON STREAMLIT ORDER_SYSTEM.BLOG_LAB.INSTAGRAM_MONTHLY TO ROLE <見る人のロール>;

この1行は、AI には流させず、人が Snowsight で流しました。権限を渡す作業は人がやる、と決めているためです。

Streamlit の版が古い

Snowflake の中の Streamlit は、手元で使うものより版が古いことがあります。別の画面で `st.dataframe(…, hide_index=True)` を使ったところ、「そんな引数は無い」と止まりました。手元で動いたコードが、そのまま動くとは限りません。

手元では使える引数が、Snowflake の中では使えずに止まった
手元では使える引数が、Snowflake の中では使えずに止まった

エラーは画面の中にそのまま出るので、どの行で止まったかはすぐ分かります。

作り方の書き方

`CREATE STREAMLIT … FROM ‘@置き場’` の書き方は、今回の環境では「対象が見つからない」と止まりました。`ROOT_LOCATION = ‘@置き場’` と `MAIN_FILE` を指定する書き方で作れました。

ファイルを置き場に上げ直したあとは、画面を開き直すと新しいほうで動きます。

まとめ

  • Streamlit in Snowflake なら、データを外に出さずに月次の画面まで作れる。見る人には画面ごとに許可を渡す
  • 画面の中で計算せず、セマンティックビューの指標を名前で引く。決まりを直す場所が1か所になり、AI の答えとも食い違わない
  • 公開しているレポートと全項目一致した期間だけを画面に出す。手元と版が違うので、動きは Snowflake の中で確かめる
ABOUT ME
石井 亮介(りょうさん)
石井 亮介(りょうさん)
データパレード 代表取締役
㈱データパレードの代表取締役で、高田馬場の町中華「一番飯店」のChief Data Officerも務めています。BIツールのセールスエンジニア・システムエンジニア・カスタマーサクセス歴15年。大学のデータサイエンス教育で講師も担当してきました。現在は自社業務のほとんどをAIに移管し、AI10部署と50を超える自動処理が24時間動く「AI経営」を実践中。その実践知をこのブログで発信しています。
記事URLをコピーしました