Hologres パス分析関数には、パス詳細関数とパスパース関数が含まれます。パス分析関数を使用すると、パス詳細を計算し、結果を効率的に解析できます。また、返されたデータをサンキー図に表示して、複雑なパス情報を視覚的に表示することもできます。このトピックでは、Hologres でパス詳細関数とパスパース関数を使用する方法について説明します。
背景情報
パス分析関数は、製品または機能を使用する際のパスの分布と各セッションのアクセスシーケンスを記録し、動作パスの直感的でわかりやすいサンキー図を生成します。サンキー図は、アクセスプロセスにおける各キーノードと、ノード間のインバウンドトラフィックとアウトバウンドトラフィックを表示します。これは、きめ細かいビジネス運用を促進します。パス分析関数は、製品の各主要機能へのアクセスを理解するのに役立ち、その後のビジネス戦略の最適化と製品の反復において、運用担当者と製品担当者をさらに支援します。Hologres は、パス詳細計算のためのパス詳細関数と、パス結果解析のためのパスパース関数をサポートしています。関数の戻り値は、サンキー図に直接表示できます。
使用上の注意
Hologres V2.2 以降では、パス分析関数がサポートされています。Hologres インスタンスのバージョンが V2.1 以前の場合は、Hologres テクニカルサポートに連絡してインスタンスをアップグレードできます。
パス分析関数を使用する前に、拡張機能を作成する必要があります。拡張機能はデータベースレベルで作成されます。データベースごとに、拡張機能を 1 回だけ作成する必要があります。
-- 拡張機能を作成します。 CREATE extension flow_analysis;説明データベースに重複する拡張機能を作成しないでください。
パス詳細関数
path_analysis_detail
path_analysis_detail 関数は、指定されたイベントデータを詳細に解析し、シリアル化された配列の形式で詳細なパス構造を返します。戻り値には、完全なパス系列、各パス内のイベント間の親子関係、各パス内の各イベントの実行時間などの主要情報が含まれます。
構文
path_analysis_detail( event, event_time, start_event, session_interval_sec, path_depth, path_offset, is_reverse, split_session_by_event)パラメーター
パラメーター
データ型
説明
event
text (データ)
分析するイベント。
event_time
timestamp、timestamptz、および bigint (データ)
イベントの時系列。
start_event
text (リテラル)
開始イベントまたは終了イベントとして指定するイベント。
session_interval_sec
bigint (リテラル)
セッション間隔。単位:秒。
セッション内の隣接するイベントの間隔がこのパラメーターの値を超えると、システムはセッションを 2 つのセッションに分割します。たとえば、このパラメーターを 30 秒に設定し、隣接するイベントの間隔が 30 秒を超えると、システムはセッションを 2 つのセッションに分割します。
path_depth
bigint (リテラル)
開始イベントまたは終了イベントからのイベント系列の長さ。
path_offset
bigint (リテラル)
開始イベントまたは終了イベントからのイベントオフセット。0 はオフセットなしを指定します。
たとえば、イベント a を開始イベントとして構成し、イベント系列 a、b、c のオフセットを 1 に設定すると、システムはイベント b からイベントマッチングを実行します。
is_reverse
bool (リテラル)
イベント系列を逆時系列順で返すかどうかを指定します。有効な値:
false:指定された開始イベントから時系列順にイベント系列を返します。
true:指定された終了イベントから逆時系列順にイベント系列を返します。
split_session_by_event
bool (リテラル)
イベントに基づいてセッションを分割するかどうかを指定します。有効な値:
true:順序付けられたイベント系列で指定された開始イベントまたは終了イベントに基づいてセッションを分割します。
false:
session_interval_secパラメーターの値のみに基づいてセッションを分割します。これがデフォルト値です。説明retentionPeriodHours parameter to 0, log data is retained indefinitely.
session_interval_sec(セッション間隔(秒))parameter を -1 に設定すると、システムは指定された開始イベントまたは終了イベントに基づいてセッションを分割します。
たとえば、パス (イベント系列 a、b、c) がセッション内で 10 回繰り返されます。
pad_funnel関数は、このセッションのコンバージョンを 1 回だけ記録します。繰り返されるパスごとに新しいセッションとして記録し、セッションごとに 1 つのコンバージョンをカウントする場合は、このパラメーターを true に設定してセッションを分割できます。このように、繰り返されるパスごとに 1 つのセッションとして記録され、セッションごとに 1 つのコンバージョンがカウントされます。戻り値
path_analysis_detail:
TEXT型の値が返されます。例:{"",\x01a\x01b<,\x01b\x01c<,""}。説明戻り値はシリアル化された配列であり、直接読み取ることはできません。パスパース関数を使用して戻り値を読み取ることができます。
pad_funnel
pad_funnel 関数は、特定のイベントの組み合わせのサブパスを取得するために使用されます。
構文
pad_funnel(path_analysis_detail(), target_path)パラメーター
パラメーター
データ型
説明
path_analysis_detail()
text (データ)
path_analysis_detail 関数によって返されるパス詳細の集計結果の配列。
target_path
text (リテラル)
イベント系列。
戻り値
path_analysis_detail:
TEXT型の値が返されます。例:text []{"",\x01a\x01b<,\x01b\x01c<,""}。説明戻り値はシリアル化された配列であり、直接読み取ることはできません。パスパース関数を使用して戻り値を読み取ることができます。
パスパース関数
pad_full_path
pad_full_path 関数は、path_analysis_detail 関数の戻り値に対して包括的なパースを実行できます。pad_full_path 関数は、フルパス、サブパス、および各イベントの時間消費も解析できます。これは、ビジネス担当者がパスをより直感的に観察するのに役立ちます。
構文
pad_full_path(path_analysis_detail())パラメーター
path_analysis_detail():path_analysis_detail 関数によって返されるパス詳細の集計結果の配列。
戻り値
次のコードは、
pad_full_path関数によって返される結果を示しています。pad_sub_path_left(unnested_pad_result) pad_sub_path_right(unnested_pad_result) pad_sub_index_left(unnested_pad_result) pad_sub_index_right(unnested_pad_result) pad_sub_cost(unnested_pad_result) pad_sub_session(unnested_pad_result)次の表は、上記のコードのパラメーターについて説明しています。
パラメーター
データ型
説明
pad_sub_path_left
text
サブパスの開始イベント。
pad_sub_path_right
text
サブパスの終了イベント。
pad_sub_index_left
bigint
サブパスが属するセッションのフルパスにおけるサブパスの開始イベントのシーケンス番号。
pad_sub_index_right
bigint
サブパスが属するセッションのフルパスにおけるサブパスの終了イベントのシーケンス番号。
pad_sub_cost
bigint
サブパスのリダイレクト時間。単位:秒。
pad_sub_session
bigint
サブパスが属する有効なセッションのシーケンス番号。
pad_session_path_array
pad_session_path_array 関数は、指定されたセッション ID に基づいてセッション内のイベント系列を正確に抽出し、パスプレフィックスでイベント系列を順番に整理できます。
構文
pad_session_path_array(path_analysis_detail(), session_idx)パラメーター
path_analysis_detail():path_analysis_detail 関数によって返されるパス詳細の集計結果の配列。
session_idx:セッション ID。
戻り値
ARRAY 型の値が返されます。
例
データの準備
-- 拡張機能を作成します。拡張機能はデータベースレベルで作成されます。データベースごとに、拡張機能を 1 回だけ作成する必要があります。
CREATE extension flow_analysis;
-- データを準備します。
CREATE TABLE path_demo(
uid text,
event text,
event_time timestamptz
);
INSERT INTO path_demo VALUES
('1','登録','2023-11-24 16:01:23+08'),
('1','ログイン','2023-11-24 16:02:10+08'),
('1','閲覧','2023-11-24 16:02:15+08'),
('1','ライブストリームの視聴','2023-11-24 16:03:10+08'),
('1','閲覧','2023-11-24 16:03:15+08'),
('1','お気に入りに追加','2023-11-24 16:04:20+08'),
('1','閲覧','2023-11-24 16:07:21+08'),
('1','購入','2023-11-24 16:08:23+08'),
('1','終了','2023-11-24 16:09:05+08'),
('2','ログイン','2023-11-24 16:10:23+08'),
('2','購入','2023-11-24 16:12:23+08'),
('3','ログイン','2023-11-24 16:02:23+08'),
('3','閲覧','2023-11-24 16:02:23+08'),
('3','お気に入りに追加','2023-11-24 16:03:53+08'),
('3','ライブストリームの視聴','2023-11-24 16:04:53+08'),
('4','ログイン','2023-11-24 16:02:23+08'),
('4','閲覧','2023-11-24 16:03:53+08'),
('4','購入','2023-11-24 16:04:23+08'),
('4','ライブストリームの視聴','2023-11-24 16:05:53+08'),
('4','注文のキャンセル','2023-11-24 16:06:53+08');例 1:すべてのイベントパスを取得する
時間に基づいてセッションを分割する:開始イベントを指定し、session_interval_sec パラメーターを 180 秒に設定し、path_depth パラメーターを 7 に設定します。
-- 時間に基づいてセッションを分割する:「ログイン」を開始イベントとして指定し、session_interval_sec パラメーターを 180 秒に設定し、path_depth パラメーターを 7 に設定し、pad_full_path 関数を使用して結果を解析します。 SELECT uid, pad_full_path(path_analysis_detail(event, event_time, 'ログイン', 180, 7, 0, false)) AS ret FROM path_demo GROUP BY uid;次のコードは、返された結果を示しています。
uid | ret -----+--------------------------------------------------- 3 | {ログイン -> お気に入りに追加 -> ライブストリームの視聴} 4 | {ログイン -> 閲覧-> 購入 -> ライブストリームの視聴 -> 注文のキャンセル} 1 | {ログイン -> 閲覧-> ライブストリームの視聴 -> 閲覧 -> お気に入りに追加} 2 | {ログイン -> 購入} (4 rows)時間とイベントに基づいてセッションを分割する:開始イベントを指定し、session_interval_sec パラメーターを 180 秒に設定し、path_depth パラメーターを 7 に設定します。
-- 時間とイベントに基づいてセッションを分割する:「閲覧」を開始イベントとして指定し、session_interval_sec パラメーターを 180 秒に設定し、path_depth パラメーターを 7 に設定し、pad_full_path 関数を使用して結果を解析します。 SELECT uid, pad_full_path(path_analysis_detail(event, event_time, '閲覧', 180, 7, 0, false,TRUE)) AS ret FROM path_demo GROUP BY uid;次のコードは、返された結果を示しています。
uid | ret -----+----------------------------------------------------------- 1 | {閲覧 -> ライブストリームの視聴, 閲覧 -> お気に入りに追加, 閲覧 -> 購入 -> 終了} 2 | {} 4 | {閲覧 -> 購入 -> ライブストリームの視聴 -> 注文のキャンセル} 3 | {閲覧 -> ログイン -> お気に入りに追加 -> ライブストリームの視聴}
例 2:パス結果を展開する
-- パスを展開します。
SELECT uid, unnest(pad_full_path(path_analysis_detail(event, event_time, 'ログイン', 180, 7, 0, false))) AS ret FROM path_demo GROUP BY uid;UNNEST 句の詳細については、「UNNEST 句」をご参照ください。
次のコードは、返された結果を示しています。
uid | ret
-----+-------------------------------------------------
3 | ログイン -> お気に入りに追加 -> ライブストリームの視聴
1 | ログイン -> 閲覧 -> ライブストリームの視聴 -> 閲覧 -> お気に入りに追加
2 | ログイン -> 購入
4 | ログイン -> 閲覧 -> 購入 -> ライブストリームの視聴 -> 注文のキャンセル
(4 rows)例 3:サブパスを展開し、各イベントのパス詳細を取得する
-- サブパスを展開します。
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, 'ログイン', 180, 7, 0, FALSE)) 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 | | ログイン | -1 | 0 | 0
1 | 0 | ログイン | 閲覧 | 0 | 1 | 5
1 | 0 | 閲覧 | ライブストリームの視聴 | 1 | 2 | 55
1 | 0 | ライブストリームの視聴 | 閲覧 | 2 | 3 | 5
1 | 0 | 閲覧 | お気に入りに追加 | 3 | 4 | 65
2 | 0 | | ログイン | -1 | 0 | 0
2 | 0 | ログイン | 購入 | 0 | 1 | 120
3 | 0 | | ログイン | -1 | 0 | 0
3 | 0 | ログイン | お気に入りに追加 | 0 | 1 | 90
3 | 0 | お気に入りに追加 | ライブストリームの視聴 | 1 | 2 | 60
4 | 0 | | ログイン | -1 | 0 | 0
4 | 0 | ログイン | 閲覧 | 0 | 1 | 90
4 | 0 | 閲覧 | 購入 | 1 | 2 | 30
4 | 0 | 購入 | ライブストリームの視聴 | 2 | 3 | 90
4 | 0 | ライブストリームの視聴 | 注文のキャンセル | 3 | 4 | 60
(15 rows)例 4:特定のセッションのイベント系列を取得する
SELECT
uid,
pad_session_path_array (path_analysis_detail (event, event_time, 'ログイン', 180, 7, 0,FALSE), 0) AS ret
FROM
path_demo
GROUP BY
uid;次のコードは、返された結果を示しています。
uid | ret
-----+-----------------------------------------------
1 | {ログイン,閲覧,ライブストリームの視聴,閲覧,お気に入りに追加}
2 | {ログイン,購入}
3 | {ログイン,お気に入りに追加,ライブストリームの視聴}
4 | {ログイン,閲覧,購入,ライブストリームの視聴,注文のキャンセル}
(4 rows)例 5:重複排除なしで各サブパスの PV と UV を計算する
-- 重複排除なしで各サブパスのページビュー (PV) とユニークビジター (UV) を計算します。重複排除が必要な場合は、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, 'ログイン', 180, 7, 0, FALSE)) 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 | | ログイン | 4
1 | ログイン | お気に入りに追加 | 1
1 | ログイン | 閲覧 | 2
1 | ログイン | 購入 | 1
2 | お気に入りに追加 | ライブストリームの視聴 | 1
2 | 閲覧 | ライブストリームの視聴 | 1
2 | 閲覧 | 購入 | 1
3 | ライブストリームの視聴 | 閲覧 | 1
3 | 購入 | ライブストリームの視聴 | 1
4 | 閲覧 | お気に入りに追加 | 1
4 | ライブストリームの視聴 | 注文のキャンセル | 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, 'ログイン', 180, 7, 0, FALSE)) 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
---------------+----------------+------------
お気に入りに追加 | ライブストリームの視聴 | 60.000000
閲覧 | お気に入りに追加 | 65.000000
閲覧 | ライブストリームの視聴 | 55.000000
閲覧 | 購入 | 30.000000
ログイン | お気に入りに追加 | 90.000000
ログイン | 閲覧 | 47.500000
ログイン | 購入 | 120.000000
ライブストリームの視聴 | 注文のキャンセル | 60.000000
ライブストリームの視聴 | 閲覧 | 5.000000
購入 | ライブストリームの視聴 | 90.000000
| ログイン | 0.000000
(11 rows)例 7:セッション内のフルパスとサブパスの関連をクエリする
-- セッション内のフルパスとサブパスの関連をクエリします。
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, 'ログイン', 180, 7, 0, false) 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 | ログイン -> お気に入りに追加 -> ライブストリームの視聴 | | ログイン | 0 | 0
3 | 0 | ログイン -> お気に入りに追加 -> ライブストリームの視聴 | ログイン | お気に入りに追加 | 1 | 90
3 | 0 | ログイン -> お気に入りに追加 -> ライブストリームの視聴 | お気に入りに追加 | ライブストリームの視聴 | 2 | 60
1 | 0 | ログイン -> 閲覧 -> ライブストリームの視聴 -> 閲覧 -> お気に入りに追加 | | ログイン | 0 | 0
1 | 0 | ログイン -> 閲覧 -> ライブストリームの視聴 -> 閲覧 -> お気に入りに追加 | ログイン | 閲覧 | 1 | 5
1 | 0 | ログイン -> 閲覧 -> ライブストリームの視聴 -> 閲覧 -> お気に入りに追加 | 閲覧 | ライブストリームの視聴 | 2 | 55
1 | 0 | ログイン -> 閲覧 -> ライブストリームの視聴 -> 閲覧 -> お気に入りに追加 | ライブストリームの視聴 | 閲覧 | 3 | 5
1 | 0 | ログイン -> 閲覧 -> ライブストリームの視聴 -> 閲覧 -> お気に入りに追加 | 閲覧 | お気に入りに追加 | 4 | 65
2 | 0 | ログイン -> 購入 | | ログイン | 0 | 0
2 | 0 | ログイン -> 購入 | ログイン | 購入 | 1 | 120
4 | 0 | ログイン -> 閲覧 -> 購入 -> ライブストリームの視聴 -> 注文のキャンセル | | ログイン | 0 | 0
4 | 0 | ログイン -> 閲覧 -> 購入 -> ライブストリームの視聴 -> 注文のキャンセル | ログイン | 閲覧 | 1 | 90
4 | 0 | ログイン -> 閲覧 -> 購入 -> ライブストリームの視聴 -> 注文のキャンセル | 閲覧 | 購入 | 2 | 30
4 | 0 | ログイン -> 閲覧 -> 購入 -> ライブストリームの視聴 -> 注文のキャンセル | 購入 | ライブストリームの視聴 | 3 | 90
4 | 0 | ログイン -> 閲覧 -> 購入 -> ライブストリームの視聴 -> 注文のキャンセル | ライブストリームの視聴 | 注文のキャンセル | 4 | 60
(15 rows)例 8:指定されたパスの詳細を表示する
-- pad_tunnel 関数を使用して、指定されたパスの詳細を表示できます。この例では、閲覧 > 購入パスの詳細またはサブパス情報がクエリされます。
SELECT uid, pad_full_path(pad_funnel(path_analysis_detail(event, event_time, 'ログイン', 180, 7, 0, false), array['ログイン', '購入'])) AS ret FROM path_demo GROUP BY uid;次のコードは、返された結果を示しています。
uid | ret
-----+------------------
3 | {ログイン}
4 | {ログイン -> 購入}
1 | {ログイン}
2 | {ログイン -> 購入}
(4 rows)