SQL вычисляет коэффициент удержания пользователей и коэффициент удержания времени

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

вставьте сюда описание изображения

Supongo que te gusta

Origin blog.csdn.net/F13122298/article/details/127112159
Recomendado
Clasificación