メインコンテンツまでスキップ
バージョン: 3.1

window_funnel

説明

スライディングウィンドウ内でイベントチェーンを検索し、イベントチェーン内の連続するイベントの最大数を計算します。この関数は、コンバージョン率の分析によく使用されます。v2.3からサポートされています。

この関数は以下のルールに従って動作します:

  • イベントチェーンの最初のイベントからカウントを開始します。最初のイベントが見つかった場合、イベントカウンターは1に設定され、スライディングウィンドウが開始されます。最初のイベントが見つからない場合、0が返されます。

  • スライディングウィンドウ内で、イベントチェーン内のイベントが順番に発生した場合、カウンターが増加します。スライディングウィンドウを超えた場合、イベントカウンターは増加しません。

  • 指定された条件に一致する複数のイベントチェーンがある場合、最も長いイベントチェーンが返されます。

構文

BIGINT window_funnel(BIGINT window, DATE|DATETIME time, INT mode, array[cond1, cond2, ..., condN])

パラメータ

  • window: スライディングウィンドウの長さ。サポートされるデータ型はBIGINTです。単位はtimeパラメータに依存します。timeのデータ型がDATEの場合、単位は日です。timeのデータ型がDATETIMEの場合、単位は秒です。

  • time: タイムスタンプを含む列。DATEとDATETIME型がサポートされています。

  • mode: イベントチェーンがフィルタリングされるモード。サポートされるデータ型はINTです。値の範囲: 0, 1, 2。

    • 0はデフォルト値で、一般的なファネル計算を示します。
    • 1DEDUPLICATIONモードを示し、フィルタリングされたイベントチェーンには重複したイベントが含まれません。例えば、arrayパラメータが[event_type = 'A', event_type = 'B', event_type = 'C', event_type = 'D']で、元のイベントチェーンが"A-B-C-B-D"の場合、イベントBは重複しており、フィルタリングされたイベントチェーンは"A-B-C"です。
    • 2FIXEDモードを示し、フィルタリングされたイベントチェーンには指定された順序を乱すイベントが含まれません。例えば、前述のarrayパラメータが使用され、元のイベントチェーンが"A-B-D-C"の場合、イベントDは順序を乱し、フィルタリングされたイベントチェーンは"A-B"です。
    • 4INCREASEモードを示し、フィルタリングされたイベントは厳密に増加するタイムスタンプを持たなければなりません。重複したタイムスタンプはイベントチェーンを乱します。このモードはバージョン2.5からサポートされています。
  • array: 定義されたイベントチェーン。配列でなければなりません。

戻り値

BIGINT型の値を返します。

例1: uidに基づいて連続するイベントの最大数を計算します。スライディングウィンドウは1800秒で、フィルタリングモードは0です。

この例では、データがuidでソートされたテーブルactionを使用します。

mysql> select * from action;
+------+------------+---------------------+
| uid | event_type | time |
+------+------------+---------------------+
| 1 | Browse | 2020-01-02 11:00:00 |
| 1 | Click | 2020-01-02 11:10:00 |
| 1 | Order | 2020-01-02 11:20:00 |
| 1 | Pay | 2020-01-02 11:30:00 |
| 1 | Browse | 2020-01-02 11:00:00 |
| 2 | Order | 2020-01-02 11:00:00 |
| 2 | Pay | 2020-01-02 11:10:00 |
| 3 | Browse | 2020-01-02 11:20:00 |
| 3 | Click | 2020-01-02 12:00:00 |
| 4 | Browse | 2020-01-02 11:50:00 |
| 4 | Click | 2020-01-02 12:00:00 |
| 5 | Browse | 2020-01-02 11:50:00 |
| 5 | Click | 2020-01-02 12:00:00 |
| 5 | Order | 2020-01-02 11:10:00 |
| 6 | Browse | 2020-01-02 11:50:00 |
| 6 | Click | 2020-01-02 12:00:00 |
| 6 | Order | 2020-01-02 12:10:00 |
+------+------------+---------------------+
17 rows in set (0.01 sec)

以下のステートメントを実行します:

select uid,
window_funnel(1800,time,0,[event_type='Browse', event_type='Click',
event_type='Order', event_type='Pay']) AS level
from action
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 4 |
| 2 | 0 |
| 3 | 1 |
| 4 | 2 |
| 5 | 2 |
| 6 | 3 |
+------+-------+

結果の説明:

  • uid = 1の一致するイベントチェーンは"Browse-Click-Order-Pay"で、4が返されます。最後の"Browse"イベントの時間(2020-01-02 11:00:00)は条件を満たさず、カウントされません。

  • uid = 2のイベントチェーンは最初のイベント"Browse"から始まらず、0が返されます。

  • uid = 3の一致するイベントチェーンは"Browse"で、1が返されます。"Click"イベントは1800秒の時間ウィンドウを超えており、カウントされません。

  • uid = 4の一致するイベントチェーンは"Browse-Click"で、2が返されます。

  • uid = 5の一致するイベントチェーンは"Browse-Click"で、2が返されます。"Order"イベント(2020-01-02 11:10:00)はイベントチェーンに属さず、カウントされません。

  • uid = 6の一致するイベントチェーンは"Browse-Click-Order"で、3が返されます。

例2: uidに基づいて連続するイベントの最大数を計算します。スライディングウィンドウは1800秒で、フィルタリングモード01を使用します。

この例では、データがtimeでソートされたテーブルaction1を使用します。

mysql> select * from action1 order by time;
+------+------------+---------------------+
| uid | event_type | time |
+------+------------+---------------------+
| 1 | Browse | 2020-01-02 11:00:00 |
| 2 | Browse | 2020-01-02 11:00:01 |
| 1 | Click | 2020-01-02 11:10:00 |
| 1 | Order | 2020-01-02 11:29:00 |
| 1 | Click | 2020-01-02 11:29:50 |
| 1 | Pay | 2020-01-02 11:30:00 |
| 1 | Click | 2020-01-02 11:40:00 |
+------+------------+---------------------+
7 rows in set (0.03 sec)

以下のステートメントを実行します:

select uid,
window_funnel(1800,time,0,[event_type='Browse',
event_type='Click', event_type='Order', event_type='Pay']) AS level
from action1
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 4 |
| 2 | 1 |
+------+-------+
2 rows in set (0.02 sec)

uid = 1の場合、"Click"イベント(2020-01-02 11:29:50)は重複したイベントですが、モード0が使用されているためカウントされます。したがって、4が返されます。

mode1に変更してステートメントを再実行します。

+------+-------+
| uid | level |
+------+-------+
| 1 | 3 |
| 2 | 1 |
+------+-------+
2 rows in set (0.05 sec)

重複排除後にフィルタリングされた最長のイベントチェーンは"Browse-Click-Order"で、3が返されます。

例3: uidに基づいて連続するイベントの最大数を計算します。スライディングウィンドウは1900秒で、フィルターモード02を使用します。

この例では、データがtimeでソートされたテーブルaction2を使用します。

mysql> select * from action2 order by time;
+------+------------+---------------------+
| uid | event_type | time |
+------+------------+---------------------+
| 1 | Browse | 2020-01-02 11:00:00 |
| 2 | Browse | 2020-01-02 11:00:01 |
| 1 | Click | 2020-01-02 11:10:00 |
| 1 | Pay | 2020-01-02 11:30:00 |
| 1 | Order | 2020-01-02 11:31:00 |
+------+------------+---------------------+
5 rows in set (0.01 sec)

以下のステートメントを実行します:

select uid,
window_funnel(1900,time,0,[event_type='Browse', event_type='Click',
event_type='Order', event_type='Pay']) AS level
from action2
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 3 |
| 2 | 1 |
+------+-------+
2 rows in set (0.02 sec)

uid = 1の場合、モード0が使用されており、"Pay"イベント(2020-01-02 11:30:00)はイベントチェーンを乱さないため、3が返されます。

mode2に変更してステートメントを再実行します。

select uid,
window_funnel(1900,time,2,[event_type='Browse', event_type='Click',
event_type='Order', event_type='Pay']) AS level
from action2
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 2 |
| 2 | 1 |
+------+-------+
2 rows in set (0.06 sec)

2が返されます。"Pay"イベントがイベントチェーンを乱し、イベントカウンターが停止します。フィルタリングされたイベントチェーンは"Browse-Click"です。

例4: uidに基づいて連続するイベントの最大数を計算します。スライディングウィンドウは1900秒で、フィルターモード04を使用します。

この例では、データがtimeでソートされたテーブルaction3を使用します。

select * from action3 order by time;
+------+------------+---------------------+
| uid | event_type | time |
+------+------------+---------------------+
| 1 | Browse | 2020-01-02 11:00:00 |
| 1 | Click | 2020-01-02 11:00:01 |
| 2 | Browse | 2020-01-02 11:00:03 |
| 1 | Order | 2020-01-02 11:00:31 |
| 2 | Click | 2020-01-02 11:00:03 |
| 2 | Order | 2020-01-02 11:01:03 |
+------+------------+---------------------+
3 rows in set (0.02 sec)

以下のステートメントを実行します:

select uid,
window_funnel(1900,time,0,[event_type='Browse', event_type='Click',
event_type='Order']) AS level
from action3
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 3 |
| 2 | 3 |
+------+-------+

uid = 1uid = 2の場合、3が返されます。

mode4に変更してステートメントを再実行します。

select uid,
window_funnel(1900,time,4,[event_type='Browse', event_type='Click',
event_type='Order']) AS level
from action3
group by uid
order by uid;
+------+-------+
| uid | level |
+------+-------+
| 1 | 3 |
| 2 | 1 |
+------+-------+
1 row in set (0.02 sec)

uid = 2の場合、モード4(厳密に増加)が使用されているため、1が返されます。"Click"は"BROWSE"と同じ秒に発生します。したがって、"Click"と"Order"はカウントされません。

キーワード

window funnel, funnel, window_funnel