我有一个 events
表,其中包含 user_id
和 created_at
列。
我想弄清楚的是在events
表中每天重复输入的用户百分比。
因此,如果第 d1
日有 user_id
[a,b,c]
,并且第 d2
日有user_id
s [b,d,e]
,那么b
是三者中唯一重复的user_id
(来自 d1
),d1
和 d2
之间有 33% 的重叠。
我希望能够将其延长任意天数。
有问题的模式:
CREATE TABLE events (
events_id serial PRIMARY KEY
, user_id VARCHAR(255) NOT NULL
, created_at datetime NOT NULL
);
这是一个大表,每天有大约 25MM 行,每天有大约 4.5MM 不同的 user_id
。
示例数据集:
+---------+---------------------+ | user_id | created_at | +---------+---------------------+ | bob | 2014-12-02 11:11:11 | | sally | 2014-12-02 12:12:11 | | zed | 2014-12-02 12:22:11 | | | ... | | chris | 2014-12-03 11:13:11 | | mark | 2014-12-03 11:11:13 | | zed | 2014-12-03 11:11:33 | | | ... | | sydney | 2014-12-04 11:14:11 | | zed | 2014-12-04 11:44:11 | | chris | 2014-12-04 11:44:11 | | | ... | | sydney | 2014-12-05 11:15:11 | | zed | 2014-12-05 11:55:11 | | chris | 2014-12-05 11:55:15 | | sandy | 2014-12-05 11:55:51 | | sydney | 2014-12-05 11:55:55 | +---------+---------------------+
预期输出:
+------------+---------------------------+ | day | returning_user_percentage | +------------+---------------------------+ | 2014-12-02 | NULL | | 2014-12-03 | 33 | | 2014-12-04 | 66 | | 2014-12-05 | 75 | +------------+---------------------------+
此外,第 2 部分可能要简单得多:我想知道每天有多少新用户,其中"new"表示 user_id
以前从未见过。
最佳答案
假设 created_at
是一个没有时间成分的日期:
select e.created_at,
avg(case when eprev.user_id is not null then 1.0 else 0.0 end) as overlap
from events e left join
events eprev
on e.created_at = eprev.created_at + interval '1' day and e.user_id = eprev.user_id
group by e.created_at
关于SQL:计算日复一日的重复用户百分比,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27240918/