すべてのプロダクト
Search
ドキュメントセンター

Hologres:パス解析関数

最終更新日:Mar 26, 2026

パス解析関数は、イベントシーケンスデータからユーザー行動パスを計算し、サンキーダイアグラムで可視化できる構造化された結果を返します。Hologres は、生のイベントデータをシリアル化されたパス構造に集約するパス詳細関数と、それらの構造から読み取り可能なフィールドを抽出するパス解析関数の2つのカテゴリを提供します。

注意事項

  • Hologres V2.2 以降はパス解析関数をサポートしています。ご利用のインスタンスが V2.1 以前を実行している場合は、Hologres テクニカルサポートに連絡してアップグレードしてください。

  • パス解析関数を使用する前に、flow_analysis 拡張を作成してください。この拡張はデータベーススコープであり、データベースごとに1回作成します。

    説明

    同じデータベースに重複する拡張を作成しないでください。

    CREATE extension flow_analysis;

仕組み

すべてのパス解析クエリは、2段階のパイプラインに従います。

  1. GROUP BY クエリ内でパス詳細関数 (path_analysis_detail または pad_funnel) を呼び出して、ユーザーごとの生のイベント行をシリアル化されたパス構造に集約します。

  2. 結果をパス解析関数 (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
)

データ引数 (テーブルの列)

引数データ型説明
eventtext分析するイベント名
event_timetimestamp, timestamptz, or bigint各イベントのタイムスタンプ

設定パラメーター (リテラル値)

パラメーターデータ型説明
start_eventtextパスをアンカーするイベント。is_reversefalse の場合、これは開始イベントです。true の場合、終了イベントです。
session_interval_secbigint非アクティブしきい値(秒単位)。2つの連続するイベント間のギャップがこの値を超えると、Hologres はそれらを個別のセッションに分割します。-1 に設定すると、start_event の繰り返し頻度のみでセッションを分割します。
path_depthbigintアンカーイベントから順方向(または逆方向)に追跡する最大イベント数。
path_offsetbigint追跡が開始される前にアンカーからスキップするイベント数。0 はオフセットなしを意味します。例えば、イベント a → b → cpath_offset = 1 の場合、追跡は b から開始されます。
is_reverseboolfalse: 開始イベントから時系列順にイベントを追跡します。true: 終了イベントから逆時系列順にイベントを追跡します。
split_session_by_eventbooltrue: タイムウィンドウ内でアンカーイベントが繰り返されるたびに新しいセッションを作成します。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つのコンバージョンとしてカウントされます。
説明

session_interval_sec-1 に設定した場合、この設定に関係なく、システムは指定された開始イベントまたは終了イベントに基づいてセッションを分割します。

セッションウィンドウごとに1つの集約されたジャーニーが必要な場合に使用します。
trueアンカーイベントが繰り返されるたびに新しいセッションが開始されるため、10回の繰り返しは10個の個別のコンバージョンとしてカウントされます。トリガーされた各パスが独立したユーザーのジャーニーである場合(例: 1回の訪問内での繰り返される購入を追跡する場合)に使用します。

pad_funnel

pad_funnel は、path_analysis_detail のシリアル化された出力を特定のターゲットイベントシーケンス(サブパス)にフィルターし、そのシーケンス外のイベントを破棄します。

構文

pad_funnel(path_analysis_detail(), target_path)

パラメーター

パラメーターデータ型説明
path_analysis_detail()textpath_analysis_detail
target_pathtextフィルター対象のイベントシーケンス。配列リテラルで指定します(例: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()textpath_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()textpath_analysis_detail
session_idxbigint抽出対象の会話インデックス(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 = 7session_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_pathUNNEST を組み合わせて使用し、各サブパスをそれが属する完全なセッションパスと関連付けます。

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 には進みませんでした。