我正在尝试使用 ClickHouse 计算登录用户次日保留率。
t_user_login
的表结构为:
┌─name────┬─type──────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ user │ String │ │ │ │ │ │
│ log_day │ DateTime('Asia/Shanghai') │ │ │ │ │ │
└─────────┴───────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘
SQL 是:
SELECT DISTINCT log_day,a.user as user_day0,b.user as user_day1
FROM (
SELECT min(log_day) as log_day, user
FROM t_user_login
GROUP BY user
) a
LEFT JOIN t_user_login b
ON dateDiff('day', b.log_day, a.log_day) = 1 AND a.user = b.user;
但收到异常:
从服务器收到异常(版本 20.11.4): 代码:403。 DB::Exception:从 localhost:9000 接收。 DB::Exception:JOIN ON 部分中的列无效。列 b.log_day 和 log_day 来自不同的表。:处理 dateDiff('day', b.log_day, log_day) = 1 时。
这确实让我困惑了很长时间。任何人都可以帮助我,谢谢。
SELECT DISTINCT log_day,a.user as user_day0,b.user as user_day1
FROM (
SELECT min(log_day) as log_day, user
FROM t_user_login
GROUP BY user
) a
LEFT JOIN t_user_login b
ON toStartOfDay(b.log_day - interval 1 day) =toStartOfDay(a.log_day) AND a.user = b.user;
对于这种情况我该怎么办?
datediff(day, b.log_day, a.log_day) BETWEEN 0 AND 3
——例如
它给出了一个我很长时间无法解决的错误: DB::Exception:不支持 JOIN ON 条件。意外的“dateDiff('day',created_at,pay_time)> = 0”:处理dateDiff('day',created_at,pay_time)> = 0时。(INVALID_JOIN_ON_EXPRESSION)