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

作った画面
画面は3つの段でできています。
- KPI:投稿数・保存率・月間リーチ・プロフィール訪問・リール本数・フィード本数・保存数・リールの平均視聴時間。目標に届いたかの判定を下に添える
- 投稿ごと:投稿日時・種類・題・リーチ・保存・いいね・その月のベスト投稿
- 月ごとの推移:月間リーチと保存率
上で対象の月を選ぶと、全部の段が切り替わります。データは Snowflake の外に出ません。見る人は Snowsight(Snowflake の画面)にログインし、左のメニューの「プロジェクト」→「Streamlit」から開きます。

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)` を使ったところ、「そんな引数は無い」と止まりました。手元で動いたコードが、そのまま動くとは限りません。

エラーは画面の中にそのまま出るので、どの行で止まったかはすぐ分かります。
作り方の書き方
`CREATE STREAMLIT … FROM ‘@置き場’` の書き方は、今回の環境では「対象が見つからない」と止まりました。`ROOT_LOCATION = ‘@置き場’` と `MAIN_FILE` を指定する書き方で作れました。
ファイルを置き場に上げ直したあとは、画面を開き直すと新しいほうで動きます。
まとめ
- Streamlit in Snowflake なら、データを外に出さずに月次の画面まで作れる。見る人には画面ごとに許可を渡す
- 画面の中で計算せず、セマンティックビューの指標を名前で引く。決まりを直す場所が1か所になり、AI の答えとも食い違わない
- 公開しているレポートと全項目一致した期間だけを画面に出す。手元と版が違うので、動きは Snowflake の中で確かめる

