Snowflake Semantic Viewの世界をSQLで探訪する
Snowflakeが提供・展開しているビジネス上の指標やエンティティを直接データベースに格納できる新しいスキーマレベルのオブジェクト 「Semantic View(セマンティックビュー)」。
物理テーブルの列にビジネス的な意味(メトリクスやディメンジョン)を付与する事で組織全体で一貫した定義を持つ指標や関係性を明確にモデリングできるようになり、様々なBIやAIツールで共通利用が可能となっています。今後の利用拡大がとても楽しみな機能ですね。
ちなみにこちらの機能、各種生成AIを活用して連携出来る形となっていますが、以下のようにSQLでの管理や参照にも対応しています。
という事で当エントリではこのSemantic Viewに対し、SQLで情報を探る、アクセスするには何をどうすれば良いのか?という観点で探ってみたいと思います。
動作検証環境の準備
まずは動作検証環境の準備。今回はSnowSQLを使って作業を進めたいと思います。(出力結果をより見やすく出力したいという思いがあったので)
## brewコマンドでインストール.
% brew install --cask snowflake-snowsql
## 設定追記.
% vi ~/.zshrc
alias snowsql=/Applications/SnowSQL.app/Contents/MacOS/snowsql
## 導入後のバージョン確認.
% snowsql --version
## 接続設定の作成.
% vi ~/.snowsql/config
[connections.xxxxxxxx-keypair]
accountname = (Snowflake接続先のアカウント名)
username = (Snowflake接続ユーザー名)
private_key_path = (接続用に作成した秘密鍵の絶対パス)
## 所定の設定でログイン出来ることを確認.
% snowsql -c xxxxxxxx-keypair
% snowsql -c xxxxxxxx-keypair -o output_format=expanded
参照するSemantic Viewを用意する
次いで、構造や仕組みを理解するためのSemantic Viewを用意していきます。方法としてはMarketplaceなどで展開されているものを活用するという手もありますが、一旦ここでは「手元でSemantic Viewを作成し、それを色々観察してみる」手法を取りたいと思います。
参考にするドキュメントは毎度お馴染みSnowflakeのQuickstart。「Getting Started with Snowflake Semantic View」 というそのものズバリのコンテンツがあるのでこれを一連ガッと実行し、リソースを用意していきます。
以下実行手順。「SQLによるアクセス・実行」に焦点を当てているのでその他の手順については割愛しています。
手順#3 環境セットアップ
--// 今回の作業用にデータベースとスキーマを作成&利用開始.
CREATE OR REPLACE DATABASE SAMPLE_DATA;
USE DATABASE SAMPLE_DATA;
CREATE OR REPLACE SCHEMA TPCDS_SF10TCL;
USE SCHEMA TPCDS_SF10TCL;
-- 今回の作業用に各種Viewを用意。ネタは「SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL」を活用.
CREATE OR REPLACE VIEW CUSTOMER AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.CUSTOMER;
CREATE OR REPLACE VIEW CUSTOMER_DEMOGRAPHICS AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.CUSTOMER_DEMOGRAPHICS;
CREATE OR REPLACE VIEW DATE_DIM AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.DATE_DIM;
CREATE OR REPLACE VIEW ITEM AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.ITEM;
CREATE OR REPLACE VIEW STORE AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.STORE;
CREATE OR REPLACE VIEW STORE_SALES AS
SELECT * FROM SNOWFLAKE_SAMPLE_DATA.TPCDS_SF10TCL.STORE_SALES;
-- 実行に際してウェアハウス、データベース、スキーマを再指定.
USE WAREHOUSE COMPUTE_WH;
USE DATABASE SAMPLE_DATA;
USE SCHEMA TPCDS_SF10TCL;
-- 作成したビューの確認.
SHOW VIEWS;
手順#4 Semantic Viewの作成
-- Semantic View作成を行うためにACCOUNTADMINロールにスイッチ.
USE ROLE ACCOUNTADMIN;
-- Semantic Viewの作成.
CREATE OR REPLACE SEMANTIC VIEW TPCDS_SEMANTIC_VIEW_SM
tables (
CUSTOMER primary key (C_CUSTOMER_SK),
DATE as DATE_DIM primary key (D_DATE_SK),
DEMO as CUSTOMER_DEMOGRAPHICS primary key (CD_DEMO_SK),
ITEM primary key (I_ITEM_SK),
STORE primary key (S_STORE_SK),
STORESALES as STORE_SALES
primary key (SS_SOLD_DATE_SK,SS_CDEMO_SK,SS_ITEM_SK,SS_STORE_SK,SS_CUSTOMER_SK)
)
relationships (
SALESTOCUSTOMER as STORESALES(SS_CUSTOMER_SK) references CUSTOMER(C_CUSTOMER_SK),
SALESTODATE as STORESALES(SS_SOLD_DATE_SK) references DATE(D_DATE_SK),
SALESTODEMO as STORESALES(SS_CDEMO_SK) references DEMO(CD_DEMO_SK),
SALESTOITEM as STORESALES(SS_ITEM_SK) references ITEM(I_ITEM_SK),
SALETOSTORE as STORESALES(SS_STORE_SK) references STORE(S_STORE_SK)
)
facts (
ITEM.COST as i_wholesale_cost,
ITEM.PRICE as i_current_price,
STORE.TAX_RATE as S_TAX_PRECENTAGE,
STORESALES.SALES_QUANTITY as SS_QUANTITY
)
dimensions (
CUSTOMER.BIRTHYEAR as C_BIRTH_YEAR,
CUSTOMER.COUNTRY as C_BIRTH_COUNTRY,
CUSTOMER.C_CUSTOMER_SK as c_customer_sk,
DATE.DATE as D_DATE,
DATE.D_DATE_SK as d_date_sk,
DATE.MONTH as D_MOY,
DATE.WEEK as D_WEEK_SEQ,
DATE.YEAR as D_YEAR,
DEMO.CD_DEMO_SK as cd_demo_sk,
DEMO.CREDIT_RATING as CD_CREDIT_RATING,
DEMO.MARITAL_STATUS as CD_MARITAL_STATUS,
ITEM.BRAND as I_BRAND,
ITEM.CATEGORY as I_CATEGORY,
ITEM.CLASS as I_CLASS,
ITEM.I_ITEM_SK as i_item_sk,
STORE.MARKET as S_MARKET_ID,
STORE.SQUAREFOOTAGE as S_FLOOR_SPACE,
STORE.STATE as S_STATE,
STORE.STORECOUNTRY as S_COUNTRY,
STORE.S_STORE_SK as s_store_sk,
STORESALES.SS_CDEMO_SK as ss_cdemo_sk,
STORESALES.SS_CUSTOMER_SK as ss_customer_sk,
STORESALES.SS_ITEM_SK as ss_item_sk,
STORESALES.SS_SOLD_DATE_SK as ss_sold_date_sk,
STORESALES.SS_STORE_SK as ss_store_sk
)
metrics (
STORESALES.TOTALCOST as SUM(item.cost),
STORESALES.TOTALSALESPRICE as SUM(SS_SALES_PRICE),
STORESALES.TOTALSALESQUANTITY as SUM(SS_QUANTITY)
WITH SYNONYMS = ( 'total sales quantity', 'total sales amount')
)
;
-- Semantic Viewの一覧を取得.
SHOW SEMANTIC VIEWS;
-- 作成したビューの定義を確認。
-- 新しいフロー演算子(->>)を使う事でmetricsとディメンションのみをフィルタリングして投影可能.
DESC SEMANTIC VIEW TPCDS_SEMANTIC_VIEW_SM
->> SELECT "object_kind","property_value" as "parent_object","object_name" FROM $1
WHERE "object_kind" IN ('METRIC','DIMENSION') AND "property" IN ('TABLE')
;
手順#6 Semantic Viewに対してクエリ実行
-- Semantic Viewに対してクエリ実行(ブランド毎のTOPセラーを表示)
SELECT * FROM SEMANTIC_VIEW
(
TPCDS_SEMANTIC_VIEW_SM
DIMENSIONS
Item.Brand,
Item.Category,
Date.Year,
Date.Month,
Store.State
METRICS
StoreSales.TotalSalesQuantity
)
WHERE Year = '2002' AND Month = '12' AND State ='TX' AND Category = 'Books'
ORDER BY TotalSalesQuantity DESC LIMIT 10;
+----------------------+----------+------+-------+-------+--------------------+
| BRAND | CATEGORY | YEAR | MONTH | STATE | TOTALSALESQUANTITY |
|----------------------+----------+------+-------+-------+--------------------|
| maximaxi #1 | Books | 2002 | 12 | TX | 4295870 |
| amalgunivamalg #1 | Books | 2002 | 12 | TX | 4212167 |
| importounivamalg #8 | Books | 2002 | 12 | TX | 4190557 |
| scholarmaxi #8 | Books | 2002 | 12 | TX | 4142716 |
| edu packunivamalg #7 | Books | 2002 | 12 | TX | 4115186 |
| scholarunivamalg #7 | Books | 2002 | 12 | TX | 4115046 |
| scholarunivamalg #8 | Books | 2002 | 12 | TX | 4109582 |
| exportiunivamalg #4 | Books | 2002 | 12 | TX | 4050496 |
| edu packunivamalg #1 | Books | 2002 | 12 | TX | 4044801 |
| maximaxi #2 | Books | 2002 | 12 | TX | 4031232 |
+----------------------+----------+------+-------+-------+--------------------+
上記手順を経てSnowflake環境にSemantic Viewが用意出来ました。以降の内容はこのSemantic Viewに対して色々見ていきます。
ケース別実践内容
SHOW SEMANTIC VIEWS
)
データベース・スキーマ配下のSemantic Viewの一覧を取得(対象範囲におけるSemantic Viewの一覧を取得する際はSHOW SEMANTIC VIEWS
コマンドを用います。
下記実行結果。予めデータベースとスキーマを指定しているので、今回作成した1つだけ取得できた形となっています。
% snowsql -c xxxxxxxx-keypair -o output_format=expanded
Private Key Passphrase:(秘密鍵に対応するパスワードを入力)
* SnowSQL * v1.4.5
Type SQL statements or !help
<username>#COMPUTE_WH@(no database).(no schema)>USE DATABASE SAMPLE_DATA;
<username>#COMPUTE_WH@SAMPLE_DATA.PUBLIC>USE SCHEMA TPCDS_SF10TCL;
<username>#COMPUTE_WH@SAMPLE_DATA.TPCDS_SF10TCL>SHOW SEMANTIC VIEWS;
***************************[ 1 ]***************************
created_on | 2025-09-XX xx:xx:xx.xxx -0700
name | TPCDS_SEMANTIC_VIEW_SM
database_name | SAMPLE_DATA
schema_name | TPCDS_SF10TCL
comment | NULL
owner | ACCOUNTADMIN
owner_role_type | ROLE
extension | NULL
同種の内容は下記SQL文(SEMANTIC_VIEWS
ビュー)でも参照可能です。
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.SEMANTIC_VIEWS;
DESC SEMANTIC VIEW
)
Semantic View構成要素の取得(対象となるSemantic Viewを構成する論理テーブル、ディメンション、ファクト、およびメトリックのプロパティを取得する際はDESC SEMANTIC VIEW
コマンドを利用します。
以下実行結果。
<username>#COMPUTE_WH@SAMPLE_DATA.TPCDS_SF10TCL>
DESC SEMANTIC VIEW TPCDS_SEMANTIC_VIEW_SM;
SELECT "object_kind", "object_name", "property", "parent_entity", "property_value"
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE "object_kind" = 'TABLE' ORDER BY "object_name", "property", "object_name";
+-------------+-------------+--------------------------+---------------+-------------------------------------------------------------------------------+
| object_kind | object_name | property | parent_entity | property_value |
|-------------+-------------+--------------------------+---------------+-------------------------------------------------------------------------------|
| TABLE | CUSTOMER | BASE_TABLE_DATABASE_NAME | NULL | SAMPLE_DATA |
| TABLE | CUSTOMER | BASE_TABLE_NAME | NULL | CUSTOMER |
| TABLE | CUSTOMER | BASE_TABLE_SCHEMA_NAME | NULL | TPCDS_SF10TCL |
| TABLE | CUSTOMER | PRIMARY_KEY | NULL | ["C_CUSTOMER_SK"] |
| TABLE | DATE | BASE_TABLE_DATABASE_NAME | NULL | SAMPLE_DATA |
| TABLE | DATE | BASE_TABLE_NAME | NULL | DATE_DIM |
| TABLE | DATE | BASE_TABLE_SCHEMA_NAME | NULL | TPCDS_SF10TCL |
| TABLE | DATE | PRIMARY_KEY | NULL | ["D_DATE_SK"] |
| TABLE | DEMO | BASE_TABLE_DATABASE_NAME | NULL | SAMPLE_DATA |
| TABLE | DEMO | BASE_TABLE_NAME | NULL | CUSTOMER_DEMOGRAPHICS |
| TABLE | DEMO | BASE_TABLE_SCHEMA_NAME | NULL | TPCDS_SF10TCL |
| TABLE | DEMO | PRIMARY_KEY | NULL | ["CD_DEMO_SK"] |
| TABLE | ITEM | BASE_TABLE_DATABASE_NAME | NULL | SAMPLE_DATA |
| TABLE | ITEM | BASE_TABLE_NAME | NULL | ITEM |
| TABLE | ITEM | BASE_TABLE_SCHEMA_NAME | NULL | TPCDS_SF10TCL |
| TABLE | ITEM | PRIMARY_KEY | NULL | ["I_ITEM_SK"] |
| TABLE | STORE | BASE_TABLE_DATABASE_NAME | NULL | SAMPLE_DATA |
| TABLE | STORE | BASE_TABLE_NAME | NULL | STORE |
| TABLE | STORE | BASE_TABLE_SCHEMA_NAME | NULL | TPCDS_SF10TCL |
| TABLE | STORE | PRIMARY_KEY | NULL | ["S_STORE_SK"] |
| TABLE | STORESALES | BASE_TABLE_DATABASE_NAME | NULL | SAMPLE_DATA |
| TABLE | STORESALES | BASE_TABLE_NAME | NULL | STORE_SALES |
| TABLE | STORESALES | BASE_TABLE_SCHEMA_NAME | NULL | TPCDS_SF10TCL |
| TABLE | STORESALES | PRIMARY_KEY | NULL | ["SS_SOLD_DATE_SK","SS_CDEMO_SK","SS_ITEM_SK","SS_STORE_SK","SS_CUSTOMER_SK"] |
+-------------+-------------+--------------------------+---------------+-------------------------------------------------------------------------------+
各列は以下の意味となります。
項目 | 説明 |
---|---|
object_kind | オブジェクトの種類。 この場合はすべて「TABLE」となり、論理テーブル定義に関する行であることを意味する |
object_name | 該当する論理テーブルの名前。 例えば「CUSTOMERS」「LINE_ITEMS」などが入る。 どのテーブルの情報かを判別するのに使用 |
property | テーブルの持つプロパティ名。 例えば「BASE_TABLE_DATABASE_NAME」「BASE_TABLE_SCHEMA_NAME」「PRIMARY_KEY」「COMMENT」など、テーブル定義要素を表す |
parent_entity | テーブルの場合は通常「NULL」となり、親となるエンティティがないことを示す。 ディメンションやファクトなどの場合はその元となるテーブルが入ることがあるが、TABLEでは通常空欄となる |
property_name | propertyで示された定義項目の具体的な値。 例えば「SNOWFLAKE_SAMPLE_DATA」「TPCH_SF1」「['C_CUSTKEY']」やテーブルの説明コメントなどが入る |
以上のことから、
このSemantic Viewは以下のDB/スキーマ/テーブル要素から成っている
SAMPLE_DATA.TPCDS_SF10TCL.CUSTOMER
SAMPLE_DATA.TPCDS_SF10TCL.STORE_SALES
SAMPLE_DATA.TPCDS_SF10TCL.DATE_DIM
SAMPLE_DATA.TPCDS_SF10TCL.STORE
SAMPLE_DATA.TPCDS_SF10TCL.CUSTOMER_DEMOGRAPHICS
SAMPLE_DATA.TPCDS_SF10TCL.ITEM
このSemantic Viewは以下の主キーを持っている
["I_ITEM_SK"]
["CD_DEMO_SK"]
["S_STORE_SK"]
["D_DATE_SK"]
["C_CUSTOMER_SK"]
["SS_SOLD_DATE_SK","SS_CDEMO_SK","SS_ITEM_SK","SS_STORE_SK","SS_CUSTOMER_SK"]
ということが読み解けました。
同種の内容は下記SQL文(SEMANTIC_TABLES
ビュー)でも参照可能です。
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.SEMANTIC_TABLES;
SELECT GET DDL
)
Semantic Viewの定義(CREATE SEMANIC VIEW文)を取得(Semantic Viewがどういう構成のもと作成されているか(=CREATE SEMANIC VIEW文)を確認したい場合はSELECT GET DDL
を使います。
ちなみにSnowflakeコンソール上では対象オブジェクトから展開されるメニューでダイレクトに辿れます
構文は以下の通り。3つ目の引数は「生成される DDL ステートメントは、再作成されるオブジェクトに完全修飾名を使用するか否か」となります。
SELECT GET_DDL('SEMANTIC_VIEW','(対象のSemantic View名)',TRUE)
以下実行結果。前述Quickstartで実行したCREATE SEMANTIC VIEW文が取得出来ています。
<username>#COMPUTE_WH@SAMPLE_DATA.TPCDS_SF10TCL>
SELECT GET_DDL(
'SEMANTIC_VIEW', 'SAMPLE_DATA.TPCDS_SF10TCL.TPCDS_SEMANTIC_VIEW_SM',
TRUE);
create or replace semantic view SAMPLE_DATA.TPCDS_SF10TCL.TPCDS_SEMANTIC_VIEW_SM
tables (
CUSTOMER primary key (C_CUSTOMER_SK),
DATE as DATE_DIM primary key (D_DATE_SK),
DEMO as CUSTOMER_DEMOGRAPHICS primary key (CD_DEMO_SK),
ITEM primary key (I_ITEM_SK),
STORE primary key (S_STORE_SK),
STORESALES as STORE_SALES primary key (SS_SOLD_DATE_SK,SS_CDEMO_SK,SS_ITEM_SK,SS_STORE_SK,SS_CUSTOMER_SK)
)
relationships (
SALESTOCUSTOMER as STORESALES(SS_CUSTOMER_SK) references CUSTOMER(C_CUSTOMER_SK),
SALESTODATE as STORESALES(SS_SOLD_DATE_SK) references DATE(D_DATE_SK),
SALESTODEMO as STORESALES(SS_CDEMO_SK) references DEMO(CD_DEMO_SK),
SALESTOITEM as STORESALES(SS_ITEM_SK) references ITEM(I_ITEM_SK),
SALETOSTORE as STORESALES(SS_STORE_SK) references STORE(S_STORE_SK)
)
facts (
ITEM.COST as i_wholesale_cost,
ITEM.PRICE as i_current_price,
STORE.TAX_RATE as S_TAX_PRECENTAGE,
STORESALES.SALES_QUANTITY as SS_QUANTITY
)
dimensions (
CUSTOMER.BIRTHYEAR as C_BIRTH_YEAR,
CUSTOMER.COUNTRY as C_BIRTH_COUNTRY,
CUSTOMER.C_CUSTOMER_SK as c_customer_sk,
DATE.DATE as D_DATE,
DATE.D_DATE_SK as d_date_sk,
DATE.MONTH as D_MOY,
DATE.WEEK as D_WEEK_SEQ,
DATE.YEAR as D_YEAR,
DEMO.CD_DEMO_SK as cd_demo_sk,
DEMO.CREDIT_RATING as CD_CREDIT_RATING,
DEMO.MARITAL_STATUS as CD_MARITAL_STATUS,
ITEM.BRAND as I_BRAND,
ITEM.CATEGORY as I_CATEGORY,
ITEM.CLASS as I_CLASS,
ITEM.I_ITEM_SK as i_item_sk,
STORE.MARKET as S_MARKET_ID,
STORE.SQUAREFOOTAGE as S_FLOOR_SPACE,
STORE.STATE as S_STATE,
STORE.STORECOUNTRY as S_COUNTRY,
STORE.S_STORE_SK as s_store_sk,
STORESALES.SS_CDEMO_SK as ss_cdemo_sk,
STORESALES.SS_CUSTOMER_SK as ss_customer_sk,
STORESALES.SS_ITEM_SK as ss_item_sk,
STORESALES.SS_SOLD_DATE_SK as ss_sold_date_sk,
STORESALES.SS_STORE_SK as ss_store_sk
)
metrics (
STORESALES.TOTALCOST as SUM(item.cost),
STORESALES.TOTALSALESPRICE as SUM(SS_SALES_PRICE),
STORESALES.TOTALSALESQUANTITY as SUM(SS_QUANTITY) with synonyms=('total sales quantity','total sales amount')
);
DESC SEMANTIC VIEW
からデータを抽出)
ディメンション・ファクト・メトリックごとの計算式や型を見たい(Semantic Viewを構成するディメンション(DIMENSION)、ファクト(FACT)、メトリック(METRIC)ごとのそれぞれの情報を見たい場合は、DESC SEMANTIC VIEW
コマンドを実行して得られる結果からこれらの要素を絞り込む形で参照します。
以下実行結果。
- カラム(列)名については
parent_eneity.object_name
の形で確認可能。 -
property
の各値説明-
ACCESS_MODIFIER
:アクセス修飾子(公開・非公開などの管理情報)。多くはPUBLICやPRIVATEが設定される。セマンティックレイヤーの管理やセキュリティ設定に関連する場合がある -
EXPRESSION
:計算式または参照項目 -
DATA_TYPE
:データ型 -
TABLE
:そのディメンション・ファクト・メトリックの元となるテーブル名(parent_entityと似た値になる場合も多い)
-
<username>#COMPUTE_WH@SAMPLE_DATA.TPCDS_SF10TCL>
DESC SEMANTIC VIEW TPCDS_SEMANTIC_VIEW_SM;
SELECT "object_kind", "property", "parent_entity", "object_name", "property_value"
FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE "object_kind" in ('DIMENSION','FACT','METRIC')
ORDER BY "object_kind" ASC, "property" ASC, "parent_entity" ASC, "object_name" ASC;
+-------------+-----------------+---------------+--------------------+-----------------------------------------------+
| object_kind | property | parent_entity | object_name | property_value |
|-------------+-----------------+---------------+--------------------+-----------------------------------------------|
| DIMENSION | ACCESS_MODIFIER | CUSTOMER | BIRTHYEAR | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | CUSTOMER | COUNTRY | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | CUSTOMER | C_CUSTOMER_SK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | DATE | DATE | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | DATE | D_DATE_SK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | DATE | MONTH | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | DATE | WEEK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | DATE | YEAR | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | DEMO | CD_DEMO_SK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | DEMO | CREDIT_RATING | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | DEMO | MARITAL_STATUS | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | ITEM | BRAND | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | ITEM | CATEGORY | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | ITEM | CLASS | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | ITEM | I_ITEM_SK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORE | MARKET | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORE | SQUAREFOOTAGE | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORE | STATE | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORE | STORECOUNTRY | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORE | S_STORE_SK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORESALES | SS_CDEMO_SK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORESALES | SS_CUSTOMER_SK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORESALES | SS_ITEM_SK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORESALES | SS_SOLD_DATE_SK | PUBLIC |
| DIMENSION | ACCESS_MODIFIER | STORESALES | SS_STORE_SK | PUBLIC |
| DIMENSION | DATA_TYPE | CUSTOMER | BIRTHYEAR | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | CUSTOMER | COUNTRY | VARCHAR(20) |
| DIMENSION | DATA_TYPE | CUSTOMER | C_CUSTOMER_SK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | DATE | DATE | DATE |
| DIMENSION | DATA_TYPE | DATE | D_DATE_SK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | DATE | MONTH | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | DATE | WEEK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | DATE | YEAR | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | DEMO | CD_DEMO_SK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | DEMO | CREDIT_RATING | VARCHAR(10) |
| DIMENSION | DATA_TYPE | DEMO | MARITAL_STATUS | VARCHAR(1) |
| DIMENSION | DATA_TYPE | ITEM | BRAND | VARCHAR(50) |
| DIMENSION | DATA_TYPE | ITEM | CATEGORY | VARCHAR(50) |
| DIMENSION | DATA_TYPE | ITEM | CLASS | VARCHAR(50) |
| DIMENSION | DATA_TYPE | ITEM | I_ITEM_SK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | STORE | MARKET | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | STORE | SQUAREFOOTAGE | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | STORE | STATE | VARCHAR(2) |
| DIMENSION | DATA_TYPE | STORE | STORECOUNTRY | VARCHAR(20) |
| DIMENSION | DATA_TYPE | STORE | S_STORE_SK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | STORESALES | SS_CDEMO_SK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | STORESALES | SS_CUSTOMER_SK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | STORESALES | SS_ITEM_SK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | STORESALES | SS_SOLD_DATE_SK | NUMBER(38,0) |
| DIMENSION | DATA_TYPE | STORESALES | SS_STORE_SK | NUMBER(38,0) |
| DIMENSION | EXPRESSION | CUSTOMER | BIRTHYEAR | C_BIRTH_YEAR |
| DIMENSION | EXPRESSION | CUSTOMER | COUNTRY | C_BIRTH_COUNTRY |
| DIMENSION | EXPRESSION | CUSTOMER | C_CUSTOMER_SK | c_customer_sk |
| DIMENSION | EXPRESSION | DATE | DATE | D_DATE |
| DIMENSION | EXPRESSION | DATE | D_DATE_SK | d_date_sk |
| DIMENSION | EXPRESSION | DATE | MONTH | D_MOY |
| DIMENSION | EXPRESSION | DATE | WEEK | D_WEEK_SEQ |
| DIMENSION | EXPRESSION | DATE | YEAR | D_YEAR |
| DIMENSION | EXPRESSION | DEMO | CD_DEMO_SK | cd_demo_sk |
| DIMENSION | EXPRESSION | DEMO | CREDIT_RATING | CD_CREDIT_RATING |
| DIMENSION | EXPRESSION | DEMO | MARITAL_STATUS | CD_MARITAL_STATUS |
| DIMENSION | EXPRESSION | ITEM | BRAND | I_BRAND |
| DIMENSION | EXPRESSION | ITEM | CATEGORY | I_CATEGORY |
| DIMENSION | EXPRESSION | ITEM | CLASS | I_CLASS |
| DIMENSION | EXPRESSION | ITEM | I_ITEM_SK | i_item_sk |
| DIMENSION | EXPRESSION | STORE | MARKET | S_MARKET_ID |
| DIMENSION | EXPRESSION | STORE | SQUAREFOOTAGE | S_FLOOR_SPACE |
| DIMENSION | EXPRESSION | STORE | STATE | S_STATE |
| DIMENSION | EXPRESSION | STORE | STORECOUNTRY | S_COUNTRY |
| DIMENSION | EXPRESSION | STORE | S_STORE_SK | s_store_sk |
| DIMENSION | EXPRESSION | STORESALES | SS_CDEMO_SK | ss_cdemo_sk |
| DIMENSION | EXPRESSION | STORESALES | SS_CUSTOMER_SK | ss_customer_sk |
| DIMENSION | EXPRESSION | STORESALES | SS_ITEM_SK | ss_item_sk |
| DIMENSION | EXPRESSION | STORESALES | SS_SOLD_DATE_SK | ss_sold_date_sk |
| DIMENSION | EXPRESSION | STORESALES | SS_STORE_SK | ss_store_sk |
| DIMENSION | TABLE | CUSTOMER | BIRTHYEAR | CUSTOMER |
| DIMENSION | TABLE | CUSTOMER | COUNTRY | CUSTOMER |
| DIMENSION | TABLE | CUSTOMER | C_CUSTOMER_SK | CUSTOMER |
| DIMENSION | TABLE | DATE | DATE | DATE |
| DIMENSION | TABLE | DATE | D_DATE_SK | DATE |
| DIMENSION | TABLE | DATE | MONTH | DATE |
| DIMENSION | TABLE | DATE | WEEK | DATE |
| DIMENSION | TABLE | DATE | YEAR | DATE |
| DIMENSION | TABLE | DEMO | CD_DEMO_SK | DEMO |
| DIMENSION | TABLE | DEMO | CREDIT_RATING | DEMO |
| DIMENSION | TABLE | DEMO | MARITAL_STATUS | DEMO |
| DIMENSION | TABLE | ITEM | BRAND | ITEM |
| DIMENSION | TABLE | ITEM | CATEGORY | ITEM |
| DIMENSION | TABLE | ITEM | CLASS | ITEM |
| DIMENSION | TABLE | ITEM | I_ITEM_SK | ITEM |
| DIMENSION | TABLE | STORE | MARKET | STORE |
| DIMENSION | TABLE | STORE | SQUAREFOOTAGE | STORE |
| DIMENSION | TABLE | STORE | STATE | STORE |
| DIMENSION | TABLE | STORE | STORECOUNTRY | STORE |
| DIMENSION | TABLE | STORE | S_STORE_SK | STORE |
| DIMENSION | TABLE | STORESALES | SS_CDEMO_SK | STORESALES |
| DIMENSION | TABLE | STORESALES | SS_CUSTOMER_SK | STORESALES |
| DIMENSION | TABLE | STORESALES | SS_ITEM_SK | STORESALES |
| DIMENSION | TABLE | STORESALES | SS_SOLD_DATE_SK | STORESALES |
| DIMENSION | TABLE | STORESALES | SS_STORE_SK | STORESALES |
| FACT | ACCESS_MODIFIER | ITEM | COST | PUBLIC |
| FACT | ACCESS_MODIFIER | ITEM | PRICE | PUBLIC |
| FACT | ACCESS_MODIFIER | STORE | TAX_RATE | PUBLIC |
| FACT | ACCESS_MODIFIER | STORESALES | SALES_QUANTITY | PUBLIC |
| FACT | DATA_TYPE | ITEM | COST | NUMBER(7,2) |
| FACT | DATA_TYPE | ITEM | PRICE | NUMBER(7,2) |
| FACT | DATA_TYPE | STORE | TAX_RATE | NUMBER(5,2) |
| FACT | DATA_TYPE | STORESALES | SALES_QUANTITY | NUMBER(38,0) |
| FACT | EXPRESSION | ITEM | COST | i_wholesale_cost |
| FACT | EXPRESSION | ITEM | PRICE | i_current_price |
| FACT | EXPRESSION | STORE | TAX_RATE | S_TAX_PRECENTAGE |
| FACT | EXPRESSION | STORESALES | SALES_QUANTITY | SS_QUANTITY |
| FACT | TABLE | ITEM | COST | ITEM |
| FACT | TABLE | ITEM | PRICE | ITEM |
| FACT | TABLE | STORE | TAX_RATE | STORE |
| FACT | TABLE | STORESALES | SALES_QUANTITY | STORESALES |
| METRIC | ACCESS_MODIFIER | STORESALES | TOTALCOST | PUBLIC |
| METRIC | ACCESS_MODIFIER | STORESALES | TOTALSALESPRICE | PUBLIC |
| METRIC | ACCESS_MODIFIER | STORESALES | TOTALSALESQUANTITY | PUBLIC |
| METRIC | DATA_TYPE | STORESALES | TOTALCOST | NUMBER(19,2) |
| METRIC | DATA_TYPE | STORESALES | TOTALSALESPRICE | NUMBER(19,2) |
| METRIC | DATA_TYPE | STORESALES | TOTALSALESQUANTITY | NUMBER(38,0) |
| METRIC | EXPRESSION | STORESALES | TOTALCOST | SUM(item.cost) |
| METRIC | EXPRESSION | STORESALES | TOTALSALESPRICE | SUM(SS_SALES_PRICE) |
| METRIC | EXPRESSION | STORESALES | TOTALSALESQUANTITY | SUM(SS_QUANTITY) |
| METRIC | SYNONYMS | STORESALES | TOTALSALESQUANTITY | ["total sales quantity","total sales amount"] |
| METRIC | TABLE | STORESALES | TOTALCOST | STORESALES |
| METRIC | TABLE | STORESALES | TOTALSALESPRICE | STORESALES |
| METRIC | TABLE | STORESALES | TOTALSALESQUANTITY | STORESALES |
+-------------+-----------------+---------------+--------------------+-----------------------------------------------+
同種の内容は下記SQL文(SEMANTIC_DIMENSIONS
ビュー/SEMANTIC_FACTS
ビュー/SEMANTIC_METRICS
ビュー)でも参照可能です。
- SEMANTIC_DIMENSIONS ビュー | Snowflake Documentation
- SEMANTIC_FACTS ビュー | Snowflake Documentation
- SEMANTIC_METRICS ビュー | Snowflake Documentation
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.SEMANTIC_DIMENSIONS;
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.SEMANTIC_FACTS;
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.SEMANTIC_METRICS;
DESC SEMANTIC VIEW
からデータを抽出)
リレーションシップを確認したい(Semantic Viewにおける各種リレーションシップを確認したい場合もDESC SEMANTIC VIEW
の結果をもとに参照可能です。
以下実行結果。
DESC SEMANTIC VIEW TPCDS_SEMANTIC_VIEW_SM;
SELECT * FROM TABLE(RESULT_SCAN(LAST_QUERY_ID()))
WHERE "object_kind" = 'RELATIONSHIP';
+--------------+-----------------+---------------+-------------+---------------------+
| object_kind | object_name | parent_entity | property | property_value |
|--------------+-----------------+---------------+-------------+---------------------|
| RELATIONSHIP | SALESTOCUSTOMER | STORESALES | TABLE | STORESALES |
| RELATIONSHIP | SALESTOCUSTOMER | STORESALES | REF_TABLE | CUSTOMER |
| RELATIONSHIP | SALESTOCUSTOMER | STORESALES | FOREIGN_KEY | ["SS_CUSTOMER_SK"] |
| RELATIONSHIP | SALESTOCUSTOMER | STORESALES | REF_KEY | ["C_CUSTOMER_SK"] |
| RELATIONSHIP | SALESTODATE | STORESALES | TABLE | STORESALES |
| RELATIONSHIP | SALESTODATE | STORESALES | REF_TABLE | DATE |
| RELATIONSHIP | SALESTODATE | STORESALES | FOREIGN_KEY | ["SS_SOLD_DATE_SK"] |
| RELATIONSHIP | SALESTODATE | STORESALES | REF_KEY | ["D_DATE_SK"] |
| RELATIONSHIP | SALESTODEMO | STORESALES | TABLE | STORESALES |
| RELATIONSHIP | SALESTODEMO | STORESALES | REF_TABLE | DEMO |
| RELATIONSHIP | SALESTODEMO | STORESALES | FOREIGN_KEY | ["SS_CDEMO_SK"] |
| RELATIONSHIP | SALESTODEMO | STORESALES | REF_KEY | ["CD_DEMO_SK"] |
| RELATIONSHIP | SALESTOITEM | STORESALES | TABLE | STORESALES |
| RELATIONSHIP | SALESTOITEM | STORESALES | REF_TABLE | ITEM |
| RELATIONSHIP | SALESTOITEM | STORESALES | FOREIGN_KEY | ["SS_ITEM_SK"] |
| RELATIONSHIP | SALESTOITEM | STORESALES | REF_KEY | ["I_ITEM_SK"] |
| RELATIONSHIP | SALETOSTORE | STORESALES | TABLE | STORESALES |
| RELATIONSHIP | SALETOSTORE | STORESALES | REF_TABLE | STORE |
| RELATIONSHIP | SALETOSTORE | STORESALES | FOREIGN_KEY | ["SS_STORE_SK"] |
| RELATIONSHIP | SALETOSTORE | STORESALES | REF_KEY | ["S_STORE_SK"] |
+--------------+-----------------+---------------+-------------+---------------------+
上記結果(表形式)そのままだとイメージが付きづらいので、この結果を生成AIに投げて「可視化してくれ」と頼んでみました。
以下はSnowflakeのSemantic Viewに対し、リレーションシップの情報を試みたものです。結果を可視化してください。結果はMermaind記法で解析し、合わせて画像としても出力してください。
(上記の結果を貼り付けて依頼)
同種の内容は下記SQL文(SEMANTIC_RELATIONSHIPS
ビュー)でも参照可能です。
SELECT * FROM SNOWFLAKE.ACCOUNT_USAGE.SEMANTIC_RELATIONSHIPS;
SEMANTIC_RELATIONSHIPSビューの結果を同様に可視化させてみた。こっちのほうが筋が良い?
SELECT FROM SEMANTIC_VIEW(...))
Semantic Viewに対するデータのクエリを実施(- セマンティックビューの権限付与 - SQL コマンドを使用したセマンティックビューの作成と管理 | Snowflake Documentation
- セマンティックビューの概要 | Snowflake Documentation
「Semantic Viewの定義(CREATE SEMANIC VIEW文)を取得」で取得したDDL文のfacts, dimensions, metricsの定義を活用してSQLを作成。
--// parent_entity.object_name
CUSTOMER.BIRTHYEAR as C_BIRTH_YEAR,
の実際の項目(CUSTOMER.BIRTHYEAR
)を活用する形です。
以下記述例。(※冒頭実践したQuickstartの内容を再掲) 下記クエリではWHERE句でデータを絞り込みしているので比較的ライトに結果が返ってきますが、未知のSemantic Viewの場合はこの絞り込み条件をどの項目に対してどのように指定すれば良いのか?という勘所が分からない状況ではあると思います。その際にどうすれば良いのか?ってのはちょっと気になるところではありますね...)
-- Semantic Viewに対してクエリ実行(ブランド毎のTOPセラーを表示)
SELECT * FROM SEMANTIC_VIEW
(
TPCDS_SEMANTIC_VIEW_SM
DIMENSIONS
Item.Brand,
Item.Category,
Date.Year,
Date.Month,
Store.State
METRICS
StoreSales.TotalSalesQuantity
)
WHERE Year = '2002' AND Month = '12' AND State ='TX' AND Category = 'Books'
ORDER BY TotalSalesQuantity DESC LIMIT 10;
+----------------------+----------+------+-------+-------+--------------------+
| BRAND | CATEGORY | YEAR | MONTH | STATE | TOTALSALESQUANTITY |
|----------------------+----------+------+-------+-------+--------------------|
| maximaxi #1 | Books | 2002 | 12 | TX | 4295870 |
| amalgunivamalg #1 | Books | 2002 | 12 | TX | 4212167 |
| importounivamalg #8 | Books | 2002 | 12 | TX | 4190557 |
| scholarmaxi #8 | Books | 2002 | 12 | TX | 4142716 |
| edu packunivamalg #7 | Books | 2002 | 12 | TX | 4115186 |
| scholarunivamalg #7 | Books | 2002 | 12 | TX | 4115046 |
| scholarunivamalg #8 | Books | 2002 | 12 | TX | 4109582 |
| exportiunivamalg #4 | Books | 2002 | 12 | TX | 4050496 |
| edu packunivamalg #1 | Books | 2002 | 12 | TX | 4044801 |
| maximaxi #2 | Books | 2002 | 12 | TX | 4031232 |
+----------------------+----------+------+-------+-------+--------------------+
まとめ
という訳で、SnowflakeのSemantic Viewに対して"SQLからのアプローチ"でどういう情報が取れるか...という観点で色々触ってみた結果の紹介でした。
Semantic Viewに関しては、Cortex Analyst Semantic View Generatorを活用する事でGUI経由で作成・管理することも出来ます。(むしろこっち使うのがメインな気はする) 興味のある人は是非こちらでのSemantic View作成を試してみてはいかがでしょうか。