查找最近6个月内有活动的用户

3qpi33ja  于 2021-07-15  发布在  ClickHouse
关注(0)|答案(1)|浏览(247)

我正在寻找最好的解决方案检索与所有过去6个月的活动的用户id列表。
表结构和数据简化如下:

CREATE TABLE activities (
  id int,
  client_id int,
  created_at timestamp
);

insert into activities values
(1, 1, '2019-06-01 00:00:00'),
(2, 2, '2019-06-01 00:00:00'), 
(3, 1, '2019-07-01 00:00:00'), 
(4, 1, '2019-08-01 00:00:00'), 
(5, 1, '2019-09-01 00:00:00'), 
(6, 1, '2019-10-01 00:00:00'), 
(7, 1, '2019-11-01 00:00:00'), 
(8, 2, '2019-11-01 00:00:00'), 
(9, 3, '2019-11-01 00:00:00');

我需要检索过去6个月中每个月至少有一个活动的用户列表。在前面的例子中 client_id 1
我想加入,但似乎太贵了。为了不偏离和接受你的想法,我不会给你任何可能的解决办法。
请考虑我必须管理一个非常大的数据源(超过5000万行)。
有什么好主意吗?

rlcwz9us

rlcwz9us1#

我不主张这一解决方案的至高无上性,部分原因是我认为这样的要求是不真诚的,但至少应该是有效的。。。

CREATE TABLE activities (
  id int,
  client_id int,
  created_at timestamp
);

insert into activities values
(1, 1, '2019-06-01 00:00:00'),
(2, 2, '2019-06-01 00:00:00'), 
(3, 1, '2019-07-01 00:00:00'), 
(4, 1, '2019-08-01 00:00:00'), 
(5, 1, '2019-09-01 00:00:00'), 
(6, 1, '2019-10-01 00:00:00'), 
(7, 1, '2019-11-01 00:00:00'), 
(8, 2, '2019-11-01 00:00:00'), 
(9, 3, '2019-11-01 00:00:00');

SELECT a.client_id 
  FROM activities a 
 WHERE a.created_at >= LAST_DAY(CURDATE() - INTERVAL 7 MONTH)+INTERVAL 1 DAY 
 GROUP 
    BY a.client_id 
HAVING COUNT(DISTINCT(DATE_FORMAT(a.created_at,'%Y-%m'))) >= 6;
+-----------+
| client_id |
+-----------+
|         1 |
+-----------+

相关问题