0
votes

I'm trying to calc login user next day retention with ClickHouse.

The table structure of t_user_login is:

┌─name────┬─type──────────────────────┬─default_type─┬─default_expression─┬─comment─┬─codec_expression─┬─ttl_expression─┐
│ user    │ String                    │              │                    │         │                  │                │
│ log_day │ DateTime('Asia/Shanghai') │              │                    │         │                  │                │
└─────────┴───────────────────────────┴──────────────┴────────────────────┴─────────┴──────────────────┴────────────────┘

And the SQL is:

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;

But received an exception:

Received exception from server (version 20.11.4): Code: 403. DB::Exception: Received from localhost:9000. DB::Exception: Invalid columns in JOIN ON section. Columns b.log_day and log_day are from different tables.: While processing dateDiff('day', b.log_day, log_day) = 1.

This really confused me for a long time. Anyone can help me, thanks.

1

1 Answers

0
votes
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;