Sql 29 вычисляет средний коэффициент удержания пользователей на следующий день.
Тема: Теперь операция хочет проверить среднюю вероятность того, что пользователи вернутся на следующий день после прочтения вопросов в определенный день. Пожалуйста, выньте соответствующие данные.
- Решение 1. Данные в таблице можно рассматривать как все вопросы, которые пришли в первый день, поэтому нам нужно создать поля, которые пришли во второй день, чтобы мы могли рассмотреть возможность использования левого соединения для объединения полей, которые пришли. на следующий день.Вы можете использовать фильтр, чтобы ограничить тех, кто придет на следующий день
date_add(date1, interval 1 day)=date2
, и использовать device_id, чтобы ограничить того же пользователя.
-- 通过左连接 筛选出第二天还会来的人
select distinct a.device_id,a.date date1,b.device_id,b.date date2
from question_practice_detail a
left join question_practice_detail b
on a.device_id=b.device_id and date_add(a.date,interval 1 day)=b.date
Помните: это левое соединение
-- 如果没有采用左连接的话
select distinct a.device_id a_device_id,a.date date1,b.device_id b_device_id,b.date date2
from question_practice_detail a,question_practice_detail b
where a.device_id=b.device_id and date_add(a.date,interval 1 day)=b.date
-- 通过左连接 筛选出第二天还会来的人
with t as (
select distinct a.device_id a_device_id,a.date date1,b.device_id b_device_id,b.date date2
from question_practice_detail a
left join question_practice_detail b
on a.device_id=b.device_id and date_add(a.date,interval 1 day)=b.date
)
-- 计算用户的次日留存率
select count(date2)/count(date1) avg_ret
from t
- Решение 2. Используйте функцию лида, чтобы объединить записи одного и того же пользователя за два дня подряд. Сначала группировка по пользователю
partition by device_id
, потом сортировка по дате по возрастаниюorder by date
, а потом сращивание два на два (последнее склеивается по умолчанию и нуль), т.е.lead(date) over (partition by device_id order by date)
-- 用lead函数
select avg(if(datediff(date2, date1)=1, 1, 0)) as avg_ret
from (
select
distinct device_id,
date as date1,
lead(date) over (partition by device_id order by date) as date2
from (
select distinct device_id, date
from question_practice_detail
) as a
) as b
SQL вычисляет коэффициент удержания на следующий день, коэффициент удержания на 3-й день и коэффициент удержания на 7-й день.
Формат данных следующий
-- 筛选出次留用户
SELECT t1.user_guid,
MAX(CASE WHEN DATEDIFF(date_time,newdate)=1 THEN 1 ELSE 0 END) '是否是次留用户'
FROM(
-- 构建一个每天的新用户表
SELECT user_guid,MIN(date_time) newdate
FROM `view_log`
GROUP BY user_guid
) t1
JOIN view_log t2 ON t1.user_guid=t2.user_guid
GROUP BY t1.user_guid
SELECT t1.date_time '日期',
COUNT(DISTINCT CASE WHEN DATEDIFF(t3.date_time,t2.newdate)=1 THEN t3.user_guid
ELSE NULL END)/COUNT(DISTINCT t2.`user_guid`) '次日留存率',
COUNT(DISTINCT CASE WHEN DATEDIFF(t3.date_time,t2.newdate)<=3 THEN t3.user_guid
ELSE NULL END)/COUNT(DISTINCT t2.`user_guid`) '3日留存率',
COUNT(DISTINCT CASE WHEN DATEDIFF(t3.date_time,t2.newdate)<=7 THEN t3.user_guid
ELSE NULL END)/COUNT(DISTINCT t2.`user_guid`) '7日留存率'
FROM(
SELECT DISTINCT date_time
FROM view_log
)t1 LEFT JOIN
(SELECT user_guid,MIN(date_time) newdate
FROM view_log
GROUP BY user_guid
)t2 ON t2.newdate=t1.date_timeLEFT JOIN view_log t3 ON t2.user_guid=t3.user_guid
GROUP BY t1.date_time