このトピックでは、Dynamic Table の増分更新でサポートされる関数の一覧を示します。基本的な集計関数のほか、hg_id_encoding や min_by/max_by などの関数について、対応状況、説明および使用例を提供します。
関数の対応状況一覧
Dynamic Table の増分更新では、COUNT、SUM、MIN/MAX、COUNT DISTINCT などの基本的な集計関数がサポートされています。以下の表には、より複雑な関数の対応状況をまとめています。
|
関数名 |
説明 |
Dynamic Table 使用例 |
対応バージョン |
|
テキスト型の UID フィールドを int 型または bigint 型にマップします。関数を呼び出すたびに、ユーザー マッピングテーブルへデータが自動的に書き込まれ、更新されます。この関数は、長期間にわたるユニークビジター (UV) の算出によく使用されます。このシナリオでは、ユーザー UID がテキスト型フィールドであり、RoaringBitmap 計算を容易にするために int 型へマップされます。 |
詳細については、「Hologres Dynamic Table を用いた任意の長期間における UV 算出」をご参照ください。 |
|
|
|
min_by および max_by 関数は、expr2 列の最小値または最大値を検出し、対応する expr1 列の値を返します。
|
詳細については、「Dynamic Table 使用例」をご参照ください。 |
|
|
|
RB_BUILD_AGG |
説明: column パラメーターには int32 型および int64 型がサポートされます。詳細については、「RoaringBitmap 関数」をご参照ください。 |
「Hologres Dynamic Table を用いた任意の長期間における UV 算出ソリューション」をご参照ください。 |
|
|
string_agg |
説明:
|
|
|
|
array_agg |
説明:
|
|
|
|
any_value |
GROUP BY 句を含む集計クエリにおいて、この関数は各集約グループ内の行からランダムに値を 1 つ選択して返します。結果は非決定的です。 |
|
|
hg_id_encoding_int32 / hg_id_encoding_int64
Hologres V4.1 以降では、hg_id_encoding_int32 および hg_id_encoding_int64 関数がサポートされます。これらの関数は、テキスト型の UID フィールドを int32 型または int64 型へマップし、ユーザー マッピングテーブルへデータを自動的に書き込みます。これらの関数を Dynamic Table の増分更新および RoaringBitmap と組み合わせることで、長期間にわたるユニークビジター (UV) の算出が可能です。詳細については、ユーザー行動分析のベストプラクティスをご参照ください。
構文
hg_id_encoding_int4(<user_id>, '<mapping_tablename>')
hg_id_encoding_int8(<user_id>, '<mapping_tablename>')
パラメーター:
-
第 1 パラメーター: テキスト型の UID 列。
-
第 2 パラメーター: ユーザー マッピングテーブルの名前。テキスト型 UID を int 型へマップするためには、事前にユーザー マッピングテーブルを作成しておく必要があります。
制限事項
-
ユーザー マッピングテーブルにはプライマリキーが必要であり、プライマリキー以外に Serial 型の列は 1 つだけ許可されます。現在、プライマリキーはテキスト型の単一カラムのみがサポートされています。
-
第 1 パラメーターにはテキスト型の UID フィールドのみがサポートされ、NULL 値は許可されません。NULL 値を指定すると、実行時にエラーが発生します。
-
関数を呼び出すと、マッピングデータがユーザー マッピングテーブルへ自動的に書き込まれます。既に存在する UID は無視され、新規データのみが追加されます。
-
Hologres V4.1 以降でのみサポートされます。
使用例
CREATE TABLE base_table(user_id text);
INSERT INTO base_table VALUES('a');
-- user_mapping テーブルを作成します。
CREATE TABLE uid_mapping(user_id text PRIMARY KEY, id serial);
-- base_table から UID を hg_id_encoding_int4 関数でマッピングし、自動的にマッピングテーブルに書き込みます。
SELECT user_id, hg_id_encoding_int4(user_id, 'uid_mapping') AS res FROM base_table;
-- マッピングテーブルをクエリします。
-- user_id | id
-- --------+----
-- a | 1min_by / max_by
min_by および max_by 関数は、expr2 列の最小値または最大値を検出し、対応する expr1 列の値を返します。
min_by(expr1, expr2)
max_by(expr1, expr2)
パラメーター: expr2 は比較対象の列、expr1 は対応する値を返す列です。戻り値: expr2 の最小値または最大値を持つ行の expr1 の値です。制限事項: Hologres V4.0 以降でのみサポートされます。
Dynamic Table 使用例
DROP TABLE IF EXISTS detail;
CREATE TABLE detail (
userid text,
event_id text,
create_time timestamptz
);
INSERT INTO detail(userid, event_id, create_time) VALUES
('user_1', 'e1', '2024-12-20 10:00:00+08'),
('user_1', 'e2', '2024-12-20 11:30:00+08'),
('user_1', 'e3', '2024-12-21 09:15:00+08'),
('user_2', 'e4', '2024-12-20 08:05:00+08'),
('user_2', 'e5', '2024-12-22 14:20:00+08'),
('user_3', 'e6', '2024-12-21 16:45:00+08');
DROP TABLE IF EXISTS detail_user_first_last_event;
CREATE DYNAMIC TABLE detail_user_first_last_event
WITH (
auto_refresh_mode = 'incremental',
computing_resource = 'local',
freshness = '3 minutes'
)
AS
SELECT
userid,
min_by(event_id, create_time) AS first_event_id,
max_by(event_id, create_time) AS last_event_id,
date_trunc('day', max(create_time))::date AS dt
FROM detail
GROUP BY userid;