sql - ClickHouse 列在处理 dateDiff 时来自不同的表
问题描述
我正在尝试使用 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;
推荐阅读
- javascript - 正则表达式 - 仅获取文本/数字和额外
- reactjs - 我可以使用默认操作弹出窗口更改 chrome 扩展的位置吗?
- dialog - AEM touch ui 对话框 6.3 - 验证错误图标重叠描述图标
- audio - 以长时间的静音录制流式音频
- openssl - 以编程方式将我的自签名证书添加到受信任的 CAS 列表中
- python - Python运行极慢一行代码
- docker - rm:无法删除“文件夹”:设备或资源繁忙 docker bind mount
- php - 如何获取输入值并用于计算数据库价格
- javascript - 如何跨浏览器和键盘布局可靠地检测 Alt+A?
- docker-compose - 如何将 Storm、Zookeeper 和 Supervisor 节点部署到 GCP?