[英]SQL: Calculate day-1 retention rate from user registration table and event log
我需要通过用户注册日期来计算第一天的保留时间。 第1天保留时间是指在注册日期后1天返回的用户数除以在注册日期注册的用户数。
这是用户表
CREATE TABLE registration (
user_id SERIAL PRIMARY KEY,
user_name VARCHAR(255) NOT NULL,
registrationDate TIMESTAMP NOT NULL
);
INSERT INTO registration (user_id, user_name, registrationDate)
VALUES
(0, 'John', '2018-01-01 00:01:00'),
(1, 'David', '2018-01-01 00:04:30'),
(2, 'Cassy', '2018-01-02 10:00:00'),
(3, 'Winka', '2018-01-02 14:30:00')
;
CREATE TABLE log (
user_id INTEGER,
eventDate TIMESTAMP
);
INSERT INTO log (user_id, eventDate)
VALUES
(0, '2018-01-01 01:00:00'),
(0, '2018-01-02 04:00:00'),
(0, '2018-01-04 06:00:00'),
(1, '2018-01-01 00:30:00'),
(3, '2018-01-02 14:40:00'),
(3, '2018-01-04 12:20:00'),
(3, '2018-01-06 13:30:00'),
(2, '2018-01-12 10:10:00'),
(2, '2018-01-13 09:00:00')
我尝试将注册表加入日志表,因此可以比较日期差。
select registration.user_id, registrationDate, log.eventDate,
(log.eventDate - registration.registrationDate) as datediff
from log left join registration ON log.user_id = registration.user_id
我想我需要执行以下任务。
where datediff = 1
我是SQL的新手,正在解决问题时学习它。 任何帮助/建议将不胜感激
预期结果应返回一个表,该表包含两列(registrationDate和保留时间),其中每位用户注册的每个日期都有行。
我不确定这是否是您的预期结果:对于registrationdate = 2018-01-01
所有两个用户均已在第一天之内登录,因此结果为1
。 对于registrationdate = 2018-01-02
只有两个用户之一记录在此范围内,因此结果为0.5
SELECT registrationdate, COUNT(*) FILTER (WHERE is_in_one_day) / daily_regs::decimal -- 6 FROM ( SELECT DISTINCT ON (l.user_id) -- 4 l.user_id, eventdate::date AS eventdate, registrationdate::date AS registrationdate, daily_regs, eventdate - registrationdate < interval '1 day' AS is_in_one_day -- 3 FROM log l JOIN ( -- 2 SELECT *, COUNT(user_id) OVER (PARTITION BY registrationdate::date) AS daily_regs --1 FROM registration ) r ON l.user_id = r.user_id ORDER BY l.user_id, eventdate ) s GROUP BY registrationdate, daily_regs -- 5
user_id
上连接两个表(在registrations
增加一列) eventdate
和registrationdate
。 检查是否少于一天。 FILTER
子句),然后除以(1)中计算的注册总数 第1天保留时间是指在注册日期后1天返回的用户数除以在注册日期注册的用户数。
这将定义解释为基于日历日。 我将其表示为:
用户注册后第二天回来的比例是多少?
我认为这是最简单的方法:
select count(distinct l.user_id) * 1.0 / count(distinct r.user_id)
from registration r left join
log l
on l.user_id = r.user_id and
l.eventDate::date = r.registrationDate::date + interval '1 day';
仅当一天中可能发生多个事件时才需要count(distinct)
。
这是db <>小提琴。
我不确定该定义是否100%有用。 如果您有其他定义,建议您提出一个新问题,并提供适当的样本数据和所需的结果 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.