clickhouse 计算留存,LTV

34 阅读1分钟

clIckhouse大数据分析-游戏玩家留存,LTV 计算 SQL 案例

计算留存

SELECT
	add_time,
	sum( add_num ) AS add_count,
	countIf ( remain = 1 ) AS remain1,
	countIf ( remain = 2 ) AS remain2,
	countIf ( remain = 3 ) AS remain3,
	countIf ( remain = 4 ) AS remain4,
	countIf ( remain = 5 ) AS remain5,
	countIf ( remain = 6 ) AS remain6,
	countIf ( remain = 7 ) AS remain7,
	countIf ( remain = 8 ) AS remain8,
	countIf ( remain = 9 ) AS remain9,
	countIf ( remain = 10 ) AS remain10,
	countIf ( remain = 11 ) AS remain11 
FROM
	(
SELECT
	b.add_time,
	( CASE WHEN a.login_time = b.add_time THEN 1 ELSE 0 END ) AS add_num,
	( CASE WHEN a.login_time >= b.add_time THEN dateDiff( 'day', b.add_time, a.login_time ) ELSE - 1 END ) AS remain 
FROM
	( SELECT role_id, cur_ts AS login_time FROM role_login_details WHERE cur_ts BETWEEN '2024-01-01' AND '2024-02-12' GROUP BY cur_ts, role_id ) AS a,
	( SELECT role_id, min( cur_ts ) AS add_time FROM role_create_details WHERE cur_ts BETWEEN '2024-01-01' AND '2024-02-12' GROUP BY role_id ) AS b 
WHERE
	a.role_id = b.role_id 
	) AS t 
WHERE
	remain >= 0 
	AND remain <= 11 
	AND add_time <= '2024-02-01' 
GROUP BY
	add_time 
ORDER BY
	add_time ASC;
​


​

计算LTV

SELECT
	add_time,
	sumIf ( money, ltv = 0 ) AS ltv0,
	sumIf ( money, ltv <= 1 ) AS ltv1,
	sumIf ( money, ltv <= 2 ) AS ltv2,
	sumIf ( money, ltv <= 3 ) AS ltv3,
	sumIf ( money, ltv <= 4 ) AS ltv4,
	sumIf ( money, ltv <= 5 ) AS ltv5,
	sumIf ( money, ltv <= 6 ) AS ltv6,
	sumIf ( money, ltv <= 7 ) AS ltv7,
	sumIf ( money, ltv <= 8 ) AS ltv8,
	sumIf ( money, ltv <= 9 ) AS ltv9,
	sumIf ( money, ltv <= 10 ) AS ltv10,
	sumIf ( money, ltv <= 11 ) AS ltv11,
	sumIf ( money, ltv <= 12 ) AS ltv12,
	sumIf ( money, ltv <= 13 ) AS ltv13 
FROM
	(
SELECT
	b.add_time,
	( CASE WHEN a.pay_time >= b.add_time THEN dateDiff( 'day', b.add_time, a.pay_time ) ELSE - 1 END ) AS ltv,
	a.money 
FROM
	( SELECT role_id, cur_ts AS pay_time, sum( money_amount ) / 100 AS money FROM recharge_details WHERE cur_ts BETWEEN '2024-01-01' GROUP BY cur_ts, role_id ) AS a,
	( SELECT role_id, min( cur_ts ) AS add_time FROM role_create_details WHERE cur_ts BETWEEN '2024-01-01' GROUP BY role_id ) AS b 
WHERE
	a.role_id = b.role_id 
	) AS t 
WHERE
	ltv >= 0 
	AND ltv <= 13 
	AND add_time <= '2024-02-01' 
GROUP BY
	add_time 
ORDER BY
	add_time ASC;