繁体   English   中英

SQL:从用户注册表和事件日志中计算第一天的保留率

[英]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

我想我需要执行以下任务。

  1. 选择datediff = 1的用户并计数。
    • 我添加了一个where语句,但收到一条错误消息,提示“ datediff不存在”
where datediff = 1
  1. 按分组日期进行分组。
    • 这也给了我一个错误:“错误:列“ registration.user_id”必须出现在GROUP BY子句中或在聚合函数中使用”

我是SQL的新手,正在解决问题时学习它。 任何帮助/建议将不胜感激

预期结果应返回一个表,该表包含两列(registrationDate和保留时间),其中每位用户注册的每个日期都有行。

我不确定这是否是您的预期结果:对于registrationdate = 2018-01-01所有两个用户均已在第一天之内登录,因此结果为1 对于registrationdate = 2018-01-02只有两个用户之一记录在此范围内,因此结果为0.5


分步演示:db <> fiddle

 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 
  1. 计算每个注册日期的注册总数。 这可以使用部分窗口函数来完成。 它添加一个带有计数的列
  2. 在其user_id上连接两个表(在registrations增加一列)
  3. 计算当前eventdateregistrationdate 检查是否少于一天。
  4. 不要让一个用户两次(在您的示例数据中不会发生,但可能是一个用户在此范围内两次登录。该用户不应被计数两次)。
  5. 按注册日期分组
  6. 计算一天之内所有记录之间的差异(使用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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM