【问题标题】:Find users with activities in all the last 6 months查找过去 6 个月内有活动的用户
【发布时间】:2020-04-02 16:59:53
【问题描述】:

我正在寻找检索过去 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 万行)。

有什么快速的想法吗?

【问题讨论】:

  • 只有一张数据表为什么要加入?
  • @JNevill 不,这是选择在过去 6 个月内有活动的所有用户,我需要过去 6 个月的每个用户。所以,11 月的活动,10 月的活动等等......
  • 在这种情况下,我会将您指向@Strawberry 评论。请包含此示例数据的所需结果,因为不清楚您的目标是什么。
  • @jared 你为什么不呢?

标签: mysql clickhouse


【解决方案1】:

我没有声称这个解决方案的至高无上,部分原因是我发现这样的要求是虚伪的,但它应该可以工作,至少......

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 |
+-----------+

【讨论】:

  • 这个解决方案不错!在 ClickHouse 中运行超过 5800 万条记录的表是快速而直接的。我没想过在格式日期上使用distinct。那真是个好主意!谢谢。
猜你喜欢
  • 1970-01-01
  • 2020-08-15
  • 1970-01-01
  • 1970-01-01
  • 2020-08-04
  • 1970-01-01
  • 2019-04-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多