保持
説明
retention関数は、イベントに対して特定の条件が満たされたかどうかを示すUInt8型の1から32個の引数の条件セットを引数として取ります。任意の条件を引数として指定することができます。
最初の条件を除き、条件はペアで適用されます:2番目の結果は1番目と2番目が真の場合に真になり、3番目は1番目と3番目が真の場合に真になる、というように続きます。
簡単に言うと、戻り値配列の最初の桁はevent_1が真か偽かを示し、2番目の桁はevent_1とevent_2の真偽を表し、3番目の桁はevent_1が真か偽か、かつevent_3が真か偽かを表す、というように続きます。event_1が偽の場合、ゼロで満たされた配列を返します。
構文
RETENTION(<event_1> [, <event_2>, ... , <event_n>]);
パラメータ
| パラメータ | 説明 |
|---|---|
<event_n> | n番目のイベント条件。型はUInt8で、値は1または0。 |
戻り値
- 1: 条件が満たされている。
- 0: 条件が満たされていない。
最大長32の1と0の配列で、最終的な出力配列の長さは入力パラメータの長さと一致します。 集約にデータが関与しない場合、NULL値が返されます。
複数の列が計算に関与する場合、いずれかの列にNULL値が含まれていると、NULL値を持つ現在の行は集約計算に参加せず、直接破棄されます。
NULL値を処理するには、計算列でIFNULL関数を使用できます。詳細については、後続の例を参照してください。
例
- サンプルテーブルを作成し、サンプルデータを挿入
CREATE TABLE retention_test(
`uid` int COMMENT 'user id',
`date` datetime COMMENT 'date time'
) DUPLICATE KEY(uid)
DISTRIBUTED BY HASH(uid) BUCKETS AUTO
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
INSERT into retention_test values
(0, '2022-10-12'),
(0, '2022-10-13'),
(0, '2022-10-14'),
(1, '2022-10-12'),
(1, '2022-10-13'),
(2, '2022-10-12');
- ユーザーリテンションを計算する
SELECT
uid,
RETENTION(date = '2022-10-12') AS r,
RETENTION(date = '2022-10-12', date = '2022-10-13') AS r2,
RETENTION(date = '2022-10-12', date = '2022-10-13', date = '2022-10-14') AS r3
FROM retention_test
GROUP BY uid
ORDER BY uid ASC;
+------+------+--------+-----------+
| uid | r | r2 | r3 |
+------+------+--------+-----------+
| 0 | [1] | [1, 1] | [1, 1, 1] |
| 1 | [1] | [1, 1] | [1, 1, 0] |
| 2 | [1] | [1, 0] | [1, 0, 0] |
+------+------+--------+-----------+
- 特殊なケースでのNULL値の処理、テーブルの再作成とデータの挿入
CREATE TABLE retention_test2(
`uid` int,
`flag` boolean,
`flag2` boolean
) DUPLICATE KEY(uid)
DISTRIBUTED BY HASH(uid) BUCKETS AUTO
PROPERTIES (
"replication_allocation" = "tag.location.default: 1"
);
INSERT into retention_test2 values (0, false, false), (1, true, NULL);
SELECT * from retention_test2;
+------+------+-------+
| uid | flag | flag2 |
+------+------+-------+
| 0 | 1 | NULL |
| 1 | 0 | 0 |
+------+------+-------+
- 空のテーブルで計算を実行する場合、集計にデータが参加せず、NULL値が返されます。
SELECT RETENTION(date = '2022-10-12') AS r FROM retention_test2 where uid is NULL;
+------+
| r |
+------+
| NULL |
+------+
- flag列のみが計算に関与します。uid = 0の時にflagがtrueであるため、1を返します。
select retention(flag) from retention_test2;
+-----------------+
| retention(flag) |
+-----------------+
| [1] |
+-----------------+
- 計算にflagとflag2の列が関与する場合、flag2がNULLであるためuid = 0の行は集計計算から除外されます。uid = 1の行のみが集計に参加し、戻り値は0になります。
select retention(flag,flag2) from retention_test2;
+-----------------------+
| retention(flag,flag2) |
+-----------------------+
| [0, 0] |
+-----------------------+
- NULL値の問題を解決するために、IFNULL関数を使用してNULLをfalseに変換することで、uid = 0とuid = 1の両方の行が集計計算に含まれるようにできます。
select retention(flag,IFNULL(flag2,false)) from retention_test2;;
+-------------------------------------+
| retention(flag,IFNULL(flag2,false)) |
+-------------------------------------+
| [1, 0] |
+-------------------------------------+