パス解析関数は、イベントシーケンスデータからユーザー行動パスを計算し、サンキーダイアグラムで可視化できる構造化された結果を返します。Hologres は、生のイベントデータをシリアル化されたパス構造に集約するパス詳細関数と、それらの構造から読み取り可能なフィールドを抽出するパス解析関数の2つのカテゴリを提供します。
注意事項
Hologres V2.2 以降はパス解析関数をサポートしています。ご利用のインスタンスが V2.1 以前を実行している場合は、Hologres テクニカルサポートに連絡してアップグレードしてください。
パス解析関数を使用する前に、
flow_analysis拡張を作成してください。この拡張はデータベーススコープであり、データベースごとに1回作成します。説明同じデータベースに重複する拡張を作成しないでください。
CREATE extension flow_analysis;
仕組み
すべてのパス解析クエリは、2段階のパイプラインに従います。
GROUP BYクエリ内でパス詳細関数 (path_analysis_detailまたはpad_funnel) を呼び出して、ユーザーごとの生のイベント行をシリアル化されたパス構造に集約します。結果をパス解析関数 (
pad_full_pathまたはpad_session_path_array) に渡して、読み取り可能なフィールド(完全なパス、サブパスの境界、持続時間、セッションID)を抽出します。
ステップ1のシリアル化された出力(例: {"",\x01a\x01b<,\x01b\x01c<,""})は直接読み取ることはできません。常に解析関数にパイプしてください。パス詳細関数
path_analysis_detail
path_analysis_detail は、ユーザーごとのイベント行をシリアル化されたパス構造に集約します。これにより、完全なイベントシーケンス、イベント間の親子関係、および連続するイベント間の経過時間がキャプチャされます。
構文
path_analysis_detail(
event, -- (data column) event name
event_time, -- (data column) event timestamp
start_event, -- (config) start or end event to anchor the path
session_interval_sec, -- (config) seconds of inactivity before splitting a session
path_depth, -- (config) max number of events to follow from the anchor
path_offset, -- (config) events to skip from the anchor before tracking
is_reverse, -- (config) false = forward from start; true = backward from end
split_session_by_event -- (config) whether to split sessions on the anchor event
)データ引数 (テーブルの列)
| 引数 | データ型 | 説明 |
|---|---|---|
event | text | 分析するイベント名 |
event_time | timestamp, timestamptz, or bigint | 各イベントのタイムスタンプ |
設定パラメーター (リテラル値)
| パラメーター | データ型 | 説明 |
|---|---|---|
start_event | text | パスをアンカーするイベント。is_reverse が false の場合、これは開始イベントです。true の場合、終了イベントです。 |
session_interval_sec | bigint | 非アクティブしきい値(秒単位)。2つの連続するイベント間のギャップがこの値を超えると、Hologres はそれらを個別のセッションに分割します。-1 に設定すると、start_event の繰り返し頻度のみでセッションを分割します。 |
path_depth | bigint | アンカーイベントから順方向(または逆方向)に追跡する最大イベント数。 |
path_offset | bigint | 追跡が開始される前にアンカーからスキップするイベント数。0 はオフセットなしを意味します。例えば、イベント a → b → c で path_offset = 1 の場合、追跡は b から開始されます。 |
is_reverse | bool | false: 開始イベントから時系列順にイベントを追跡します。true: 終了イベントから逆時系列順にイベントを追跡します。 |
split_session_by_event | bool | true: タイムウィンドウ内でアンカーイベントが繰り返されるたびに新しいセッションを作成します。false (デフォルト): session_interval_sec のみに基づいてセッションを分割します。 |
戻り値
TEXT シリアル化された配列(例: {"",\x01a\x01b<,\x01b\x01c<,""})を返します。この出力は pad_full_path または pad_session_path_array に渡してください。直接読み取ることはできません。
split_session_by_event の動作
このパラメーターは、単一のタイムウィンドウ内の繰り返されるパスがどのようにカウントされるかを制御します。
| 値 | 動作 | 使用するタイミング |
|---|---|---|
false (デフォルト) | セッション内で a → b → c という繰り返されるパスが10回発生した場合、そのセッションでは1つのコンバージョンとしてカウントされます。説明
| セッションウィンドウごとに1つの集約されたジャーニーが必要な場合に使用します。 |
true | アンカーイベントが繰り返されるたびに新しいセッションが開始されるため、10回の繰り返しは10個の個別のコンバージョンとしてカウントされます。 | トリガーされた各パスが独立したユーザーのジャーニーである場合(例: 1回の訪問内での繰り返される購入を追跡する場合)に使用します。 |
pad_funnel
pad_funnel は、path_analysis_detail のシリアル化された出力を特定のターゲットイベントシーケンス(サブパス)にフィルターし、そのシーケンス外のイベントを破棄します。
構文
pad_funnel(path_analysis_detail(), target_path)パラメーター
| パラメーター | データ型 | 説明 |
|---|---|---|
path_analysis_detail() | text | path_analysis_detail |
target_path | text | フィルター対象のイベントシーケンス。配列リテラルで指定します(例:array['Log on', 'Purchase'])。 |
戻り値
TEXT シリアル化された配列(例: text []{"",\x01a\x01b<,\x01b\x01c<,""})を返します。結果をパス解析関数に渡してください。
パス解析関数
pad_full_path
pad_full_path は、path_analysis_detail(または pad_funnel)のシリアル化された出力を構造化されたフィールドに解析します。これには、セッションごとの完全なパス、各サブパスの開始イベントと終了イベント、完全なパス内のそれらの位置、およびそれらの間の経過時間が含まれます。
構文
pad_full_path(path_analysis_detail())パラメーター
| パラメーター | データ型 | 説明 |
|---|---|---|
path_analysis_detail() | text | path_analysis_detail |
戻り値
pad_full_path は配列を返します。UNNEST を使用して行に展開し、以下のサブ関数で個々のフィールドを抽出します。
| サブ関数 | 戻り値の型 | 説明 |
|---|---|---|
pad_sub_path_left(result) | text | サブパスの開始イベント |
pad_sub_path_right(result) | text | サブパスの終了イベント |
pad_sub_index_left(result) | bigint | 完全なパス内の開始イベントの位置(0ベース) |
pad_sub_index_right(result) | bigint | 完全なパス内の終了イベントの位置(0ベース) |
pad_sub_cost(result) | bigint | サブパスのリダイレクト持続時間(秒単位) |
pad_sub_session(result) | bigint | このサブパスが属する有効なセッションのインデックス(0ベース) |
pad_session_path_array
pad_session_path_array は、path_analysis_detail のシリアル化された出力から、特定のセッションの順序付けられたイベントシーケンスを抽出します。
構文
pad_session_path_array(path_analysis_detail(), session_idx)パラメーター
| パラメーター | データ型 | 説明 |
|---|---|---|
path_analysis_detail() | text | path_analysis_detail |
session_idx | bigint | 抽出対象の会話インデックス(0 基準) |
戻り値
セッション内で発生した順序でイベント名の ARRAY を返します。
例
サンプルデータの準備
-- Create the extension (once per database).
CREATE extension flow_analysis;
-- Create a sample event table.
CREATE TABLE path_demo(
uid text,
event text,
event_time timestamptz
);
-- Insert sample events for four users.
INSERT INTO path_demo VALUES
('1', 'Register', '2023-11-24 16:01:23+08'),
('1', 'Log on', '2023-11-24 16:02:10+08'),
('1', 'Browse', '2023-11-24 16:02:15+08'),
('1', 'View live streams', '2023-11-24 16:03:10+08'),
('1', 'Browse', '2023-11-24 16:03:15+08'),
('1', 'Add to favorites', '2023-11-24 16:04:20+08'),
('1', 'Browse', '2023-11-24 16:07:21+08'),
('1', 'Purchase', '2023-11-24 16:08:23+08'),
('1', 'Exit', '2023-11-24 16:09:05+08'),
('2', 'Log on', '2023-11-24 16:10:23+08'),
('2', 'Purchase', '2023-11-24 16:12:23+08'),
('3', 'Log on', '2023-11-24 16:02:23+08'),
('3', 'Browse', '2023-11-24 16:02:23+08'),
('3', 'Add to favorites', '2023-11-24 16:03:53+08'),
('3', 'View live streams', '2023-11-24 16:04:53+08'),
('4', 'Log on', '2023-11-24 16:02:23+08'),
('4', 'Browse', '2023-11-24 16:03:53+08'),
('4', 'Purchase', '2023-11-24 16:04:23+08'),
('4', 'View live streams', '2023-11-24 16:05:53+08'),
('4', 'Cancel the order', '2023-11-24 16:06:53+08');以下のすべての例では、この path_demo テーブルを使用します。
例1: ユーザーごとの完全なパスを取得
以下の2つの例はどちらも path_depth = 7 と session_interval_sec = 180 を使用しています。これらは、セッションが非アクティブのみで分割されるか、非アクティブとアンカーイベントの繰り返し頻度の両方で分割されるかによって異なります。
時間のみでセッションを分割 (split_session_by_event = false)
Log on でアンカーします。連続するイベント間のギャップが180秒を超えると、セッションが終了します。
SELECT
uid,
pad_full_path(
path_analysis_detail(
event,
event_time,
'Log on', -- start_event: パスを「Log on」にアンカー
180, -- session_interval_sec: 180秒の非アクティブ後に分割
7, -- path_depth: アンカーから最大7つのイベントを追跡
0, -- path_offset: オフセットなし
false -- is_reverse: 時系列順
-- split_session_by_event: 省略、デフォルトはfalse
)
) AS ret
FROM path_demo
GROUP BY uid;結果:
uid | ret
-----+---------------------------------------------------
3 | {Log on -> Add to favorites -> View live streams}
4 | {Log on -> Browse -> Purchase -> View live streams -> Cancel the order}
1 | {Log on -> Browse -> View live streams -> Browse -> Add to favorites}
2 | {Log on -> Purchase}
(4 rows)時間とアンカーイベントの繰り返し頻度でセッションを分割 (split_session_by_event = true)
Browse でアンカーします。非アクティブが180秒を超えた場合と、Browse が繰り返される場合の両方で新しいセッションが開始されます。
SELECT
uid,
pad_full_path(
path_analysis_detail(
event,
event_time,
'Browse', -- start_event: パスを「Browse」にアンカー
180, -- session_interval_sec
7, -- path_depth
0, -- path_offset
false, -- is_reverse: 時系列順
true -- split_session_by_event: 各「Browse」で新しいセッション
)
) AS ret
FROM path_demo
GROUP BY uid;結果:
uid | ret
-----+-----------------------------------------------------------
1 | {Browse -> View live streams, Browse -> Add to favorites, Browse -> Purchase -> Exit}
2 | {}
4 | {Browse -> Purchase -> View live streams -> Cancel the order}
3 | {Browse -> Log on -> Add to favorites -> View live streams}ユーザー1は Browse が3回発生するため、3つの個別のセッションを持っています。ユーザー2には Browse イベントが存在しないため、結果がありません。
例2: パス結果を行に展開
UNNEST を使用してパス配列をセッションパスごとに1行に展開します。これはダウンストリーム集約に役立ちます。
SELECT
uid,
unnest(
pad_full_path(
path_analysis_detail(
event,
event_time,
'Log on', -- start_event
180, -- session_interval_sec
7, -- path_depth
0, -- path_offset
false -- is_reverse
)
)
) AS ret
FROM path_demo
GROUP BY uid;結果:
uid | ret
-----+-------------------------------------------------
3 | Log on -> Add to favorites -> View live streams
1 | Log on -> Browse -> View live streams -> Browse -> Add to favorites
2 | Log on -> Purchase
4 | Log on -> Browse -> Purchase -> View live streams -> Cancel the order
(4 rows)詳細については、「UNNEST 句」をご参照ください。
例3: サブパスを展開し、イベントごとのタイミングを取得
生の path_analysis_detail 出力(pad_full_path なし)で UNNEST を実行すると、サブパスごとに1行が生成されます。各行を pad_sub_* サブ関数に渡して、開始イベント、終了イベント、位置、および経過時間を抽出します。
SELECT
uid,
pad_sub_session(ret) AS session_id,
pad_sub_path_left(ret) AS sub_path_left,
pad_sub_path_right(ret) AS sub_path_right,
pad_sub_index_left(ret) AS sub_index_left,
pad_sub_index_right(ret) AS sub_index_right,
pad_sub_cost(ret) AS sub_cost
FROM (
SELECT
uid,
unnest(
path_analysis_detail(
event,
event_time,
'Log on', -- start_event
180, -- session_interval_sec
7, -- path_depth
0, -- path_offset
false -- is_reverse
)
) AS ret
FROM path_demo
GROUP BY uid
) a;結果:
uid | session_id | sub_path_left | sub_path_right | sub_index_left | sub_index_right | sub_cost
-----+------------+------------------+-------------------+----------------+-----------------+----------
1 | 0 | | Log on | -1 | 0 | 0
1 | 0 | Log on | Browse | 0 | 1 | 5
1 | 0 | Browse | View live streams | 1 | 2 | 55
1 | 0 | View live streams| Browse | 2 | 3 | 5
1 | 0 | Browse | Add to favorites | 3 | 4 | 65
2 | 0 | | Log on | -1 | 0 | 0
2 | 0 | Log on | Purchase | 0 | 1 | 120
3 | 0 | | Log on | -1 | 0 | 0
3 | 0 | Log on | Add to favorites | 0 | 1 | 90
3 | 0 | Add to favorites | View live streams | 1 | 2 | 60
4 | 0 | | Log on | -1 | 0 | 0
4 | 0 | Log on | Browse | 0 | 1 | 90
4 | 0 | Browse | Purchase | 1 | 2 | 30
4 | 0 | Purchase | View live streams | 2 | 3 | 90
4 | 0 | View live streams| Cancel the order | 3 | 4 | 60
(15 rows)各ユーザーの最初の行(sub_path_left が空で sub_index_left = -1 の場合)は、アンカーイベントの前の仮想エントリポイントを表します。
例4: 特定のセッションのイベントシーケンスを取得
pad_session_path_array は、セッションインデックス 0(各ユーザーの最初のセッション)の順序付けられたイベントを抽出します。
SELECT
uid,
pad_session_path_array(
path_analysis_detail(
event,
event_time,
'Log on', -- start_event
180, -- session_interval_sec
7, -- path_depth
0, -- path_offset
false -- is_reverse
),
0 -- session_idx: 最初のセッション(0ベース)を取得
) AS ret
FROM path_demo
GROUP BY uid;結果:
uid | ret
-----+-----------------------------------------------
1 | {Log on,Browse,View live streams,Browse,Add to favorites}
2 | {Log on,Purchase}
3 | {Log on,Add to favorites,View live streams}
4 | {Log on,Browse,Purchase,View live streams,Cancel the order}
(4 rows)例5: サブパスごとのトランジションをカウント
以下のクエリは、すべてのユーザー(ページビュー)にわたって各サブパスのトランジションが何回発生するかをカウントします。代わりにユニークビジターをカウントするには、集約する前に uid で重複排除してください。
SELECT
sub_index,
sub_path_left,
sub_path_right,
count(uid)
FROM (
SELECT
uid,
pad_sub_path_left(ret) AS sub_path_left,
pad_sub_path_right(ret) AS sub_path_right,
pad_sub_index_right(ret) AS sub_index
FROM (
SELECT
uid,
unnest(
path_analysis_detail(
event,
event_time,
'Log on', -- start_event
180, -- session_interval_sec
7, -- path_depth
0, -- path_offset
false -- is_reverse
)
) AS ret
FROM path_demo
GROUP BY uid
) a
) a
GROUP BY sub_index, sub_path_left, sub_path_right
ORDER BY sub_index, sub_path_left, sub_path_right;結果:
sub_index | sub_path_left | sub_path_right | count
-----------+------------------+-------------------+-------
0 | | Log on | 4
1 | Log on | Add to favorites | 1
1 | Log on | Browse | 2
1 | Log on | Purchase | 1
2 | Add to favorites | View live streams | 1
2 | Browse | View live streams | 1
2 | Browse | Purchase | 1
3 | View live streams| Browse | 1
3 | Purchase | View live streams | 1
4 | Browse | Add to favorites | 1
4 | View live streams| Cancel the order | 1
(11 rows)例6: サブパスごとの平均持続時間を計算
SELECT
sub_path_left,
sub_path_right,
avg(sub_cost)
FROM (
SELECT
uid,
pad_sub_path_left(ret) AS sub_path_left,
pad_sub_path_right(ret) AS sub_path_right,
pad_sub_cost(ret) AS sub_cost
FROM (
SELECT
uid,
unnest(
path_analysis_detail(
event,
event_time,
'Log on', -- start_event
180, -- session_interval_sec
7, -- path_depth
0, -- path_offset
false -- is_reverse
)
) AS ret
FROM path_demo
GROUP BY uid
) a
) a
GROUP BY sub_path_left, sub_path_right
ORDER BY sub_path_left, sub_path_right;結果:
sub_path_left | sub_path_right | avg
------------------+-------------------+------------
Add to favorites | View live streams | 60.000000
Browse | Add to favorites | 65.000000
Browse | View live streams | 55.000000
Browse | Purchase | 30.000000
Log on | Add to favorites | 90.000000
Log on | Browse | 47.500000
Log on | Purchase | 120.000000
View live streams| Cancel the order | 60.000000
View live streams| Browse | 5.000000
Purchase | View live streams | 90.000000
| Log on | 0.000000
(11 rows)例7: 単一クエリで完全なパスとサブパスを結合
以下のクエリは、pad_full_path と UNNEST を組み合わせて使用し、各サブパスをそれが属する完全なセッションパスと関連付けます。
SELECT
uid,
pad_sub_session(item) AS session_id,
full_path[pad_sub_session(item) + 1] AS full_path,
pad_sub_path_left(item) AS sub_path_left,
pad_sub_path_right(item) AS sub_path_right,
pad_sub_index_right(item) AS sub_idx,
pad_sub_cost(item) AS sub_cost
FROM (
SELECT
uid,
unnest(ret) AS item,
pad_full_path(ret) AS full_path
FROM (
SELECT
uid,
path_analysis_detail(
event,
event_time,
'Log on', -- start_event
180, -- session_interval_sec
7, -- path_depth
0, -- path_offset
false -- is_reverse
) AS ret
FROM path_demo
GROUP BY uid
) a
) a;結果:
uid | session_id | full_path | sub_path_left | sub_path_right | sub_idx | sub_cost
-----+------------+---------------------------------------------------------+------------------+-------------------+---------+----------
3 | 0 | Log on -> Add to favorites -> View live streams | | Log on | 0 | 0
3 | 0 | Log on -> Add to favorites -> View live streams | Log on | Add to favorites | 1 | 90
3 | 0 | Log on -> Add to favorites -> View live streams | Add to favorites | View live streams | 2 | 60
1 | 0 | Log on -> Browse -> View live streams -> Browse -> Add to favorites | | Log on | 0 | 0
1 | 0 | Log on -> Browse -> View live streams -> Browse -> Add to favorites | Log on | Browse | 1 | 5
1 | 0 | Log on -> Browse -> View live streams -> Browse -> Add to favorites | Browse | View live streams | 2 | 55
1 | 0 | Log on -> Browse -> View live streams -> Browse -> Add to favorites | View live streams| Browse | 3 | 5
1 | 0 | Log on -> Browse -> View live streams -> Browse -> Add to favorites | Browse | Add to favorites | 4 | 65
2 | 0 | Log on -> Purchase | | Log on | 0 | 0
2 | 0 | Log on -> Purchase | Log on | Purchase | 1 | 120
4 | 0 | Log on -> Browse -> Purchase -> View live streams -> Cancel the order| | Log on | 0 | 0
4 | 0 | Log on -> Browse -> Purchase -> View live streams -> Cancel the order| Log on | Browse | 1 | 90
4 | 0 | Log on -> Browse -> Purchase -> View live streams -> Cancel the order| Browse | Purchase | 2 | 30
4 | 0 | Log on -> Browse -> Purchase -> View live streams -> Cancel the order| Purchase | View live streams | 3 | 90
4 | 0 | Log on -> Browse -> Purchase -> View live streams -> Cancel the order| View live streams| Cancel the order | 4 | 60
(15 rows)例8: 特定のファネルパスにフィルター
pad_funnel を使用して、特定イベントシーケンスをたどったユーザーに結果を制限します。以下のクエリは、Log on → Purchase を経由したユーザーを検索します。
SELECT
uid,
pad_full_path(
pad_funnel(
path_analysis_detail(
event,
event_time,
'Log on', -- start_event
180, -- session_interval_sec
7, -- path_depth
0, -- path_offset
false -- is_reverse
),
array['Log on', 'Purchase'] -- target_path: このファネルにフィルター
)
) AS ret
FROM path_demo
GROUP BY uid;結果:
uid | ret
-----+----------------------
3 | {Log on}
4 | {Log on -> Purchase}
1 | {Log on}
2 | {Log on -> Purchase}
(4 rows)ユーザー4と2は完全な Log on → Purchase ファネルを完了しました。ユーザー1と3は Log on に到達しましたが、追跡されたパスの深さ内で Purchase には進みませんでした。