パラメータ化ビューとは
MaxCompute(ODPS)のパラメータ化ビューは、呼び出し側から値やテーブルを引数に受け取るビューです。条件やJOIN対象を外から指定できるため、用途ごとに似たSQLを量産する必要が減ります。引数にはスカラ型と表型の両方を使えます。
基本構文
以下は、期間と地域テーブルを引数に取るパラメータ化ビューの例です。
CREATE VIEW revenue_summary(
@cutoff_date STRING,
@region_set TABLE(region_code STRING)
) AS
SELECT
o.order_id,
r.region_name,
SUM(oi.amount) AS total_amount
FROM orders o
JOIN order_items oi ON o.order_id = oi.order_id
JOIN @region_set r ON o.region_code = r.region_code
WHERE o.order_date <= @cutoff_date
GROUP BY o.order_id, r.region_name;
定義のポイントは次の通りです。
- スカラパラメータは
STRING、DATETIMEなどの型を指定する - 表型パラメータは
TABLE(列名 型, ...)で宣言する - SQL内では
@paramの形式で変数として利用する
呼び出し方
CTEで引数テーブルを作成し、ビューに渡します。
WITH target_regions AS (
SELECT 'A01' AS region_code, '関東' AS region_name
UNION ALL
SELECT 'A02', '関西'
)
SELECT * FROM revenue_summary('2024-03-31', target_regions);
動的テーブルJOINの活用
ユーザー行動分析などで、ユーザーマスタと行動ログを業務線ごとに切り替えたい場合に有効です。表型パラメータを使うことで、同じ集計ロジックをテーブル名ごとに再利用できます。
CREATE VIEW recent_user_metrics(
@user_master TABLE(
user_id STRING,
register_date STRING,
* ANY
),
@action_log TABLE(
user_id STRING,
action_time STRING,
* ANY
),
@lookback_days BIGINT
) AS
SELECT
u.user_id,
u.register_date,
MAX(a.action_time) AS last_action_time,
COUNT(*) AS action_count
FROM @user_master u
JOIN @action_log a ON u.user_id = a.user_id
WHERE a.action_time >= DATE_SUB(GETDATE(), CAST(@lookback_days AS INT))
GROUP BY u.user_id, u.register_date;
呼び出し例
同じビューを、異なる行動ログテーブルに適用できます。
-- EC業務線(過去30日)
WITH u AS (
SELECT user_id, register_date FROM dim_users
),
a AS (
SELECT user_id, action_time FROM dwd_ec_events
)
SELECT * FROM recent_user_metrics(u, a, 30);
-- コンテンツ業務線(過去7日)
WITH u AS (
SELECT user_id, register_date FROM dim_users
),
a AS (
SELECT user_id, action_time FROM dwd_content_events
)
SELECT * FROM recent_user_metrics(u, a, 7);
注意点
- 表型パラメータは
FROMやJOINの対象として使用する - CTEからテーブルを渡す際は、列名と型がビュー定義と一致するよう明示する
- 可変列を受け入れる場合は
* ANYを宣言する - スカラパラメータは型変換を明確に行い、実行時の暗黙変換を避ける