ClickHouse 处理 dateDiff 时列来自不同的表

问题描述 投票:0回答:2

我正在尝试使用 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 时。

这确实让我困惑了很长时间。任何人都可以帮助我,谢谢。

sql database datediff clickhouse
2个回答
0
投票
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;

-1
投票

对于这种情况我该怎么办?

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)

© www.soinside.com 2019 - 2024. All rights reserved.