次日留存率

--用户数据表结构
--yyyymmdd 代表用户测试这句话说的日期 ---dt
--nlu_utterance 代表用户说的某句话   ---platform
--svicd 代表用户的手机码 ------ mid


--sf_user_data--代表用户说某句话的所有log
--sf_first_user_data 所有的新增用户




--表1、记录用户首次使用的日期


drop table if exists cincinnati_com.sf_first_user_data
create table if not exists cincinnati_com.sf_first_user_data as


--SELECT *, Row_Number() OVER (partition by deptid ORDER BY salary desc) rank FROM employee


select * ,Row_Number () OVER (partition by table1.svicd ORDER BY table1.uid esc) rank from(
select svicd,
       uid,
  nlu_utterance
from kpi_team.bixby_daily_report
where language = 'zh-CN'
and yyyymmdd between 20180208 and 20180228
and nlu_utterance like '%XX%'
) as table1 
where rank = 1

------------------------------------------------------
--表2、创建该表让新增用户时间+1 和 sf_user_data 做个inner join ,取 其 的数量 / sf_first_user_data 的数量 为 次日留存率
select 
   svicd,
   uid,
   nlu_utterance
 from
(select 
svicd,
uid,
    nlu_utterance,
    yyyymmdd
from sf_first_user_data
as table1)
where yyyymmdd = table1.yyyymmdd






--日期增加函数
 --date_add(string startdate, int days)
 
 select
    date_add('yyyymmdd',1) from test;

 
 
































insert into report_userinfo   
select   
xinzeng.platform,  
xinzeng.dt,  
xinzeng.channel,  
xinzeng.cver,  
2,  
count(distinct cunliu.pcid),  
datediff(  
    from_unixtime(unix_timestamp(cast(cunliu.dt as string),'yyyyMMdd')),  
    from_unixtime(unix_timestamp(cast(xinzeng.dt as string),'yyyyMMdd'))  
)  
from  
(  
    select * from user_login_history where type=1  
) xinzeng  
inner join   
(  
    select   
    platform,  
    dt,  
    channel,  
    cver,  
    mid pcid   
    from log_vvim   
    where mid is not null and dt=$dt group by platform,dt,channel,cver,mid  
) cunliu on  
(  
    xinzeng.platform=cunliu.platform and  
    xinzeng.channel=cunliu.channel and  
    xinzeng.cver=cunliu.cver and  
    xinzeng.pcid=cunliu.pcid  
)  
where cunliu.dt>xinzeng.dt   
group by   
xinzeng.platform,xinzeng.dt,xinzeng.channel,xinzeng.cver,  
datediff(  
    from_unixtime(unix_timestamp(cast(cunliu.dt as string),'yyyyMMdd')),  
    from_unixtime(unix_timestamp(cast(xinzeng.dt as string),'yyyyMMdd'))  
);  










select  retention_sum(xwho_state, 4, 30, 1, 5) 
from (
select  retention_count(
date_diff('day', from_iso8601_timestamp('2018-02-26'), to_timestamp(day, 'yyyymmdd')), 4, 1, 5, 
case when ( day >= '20180226' and day <= '20180301'  and standard_event_id = 1311 and standard_app_id=100361  ) and ( day >= '20180227' and day <= '20180331'  and standard_event_id = 132678 and standard_app_id=100361  ) then 0  
when ( day >= '20180226' and day <= '20180301'  and standard_event_id = 1311 and standard_app_id=100361  ) then 1 else -1 end  , 1, -1) as xwho_state
from fz_bds.bds_ait_device_event_info_d eventAttr 
where
        (
         (day >= '20180226' and day <= '20180301'  and standard_event_id = 1311 and standard_app_id=100361 ) or
     (day >= '20180227' and day <= '20180331'  and standard_event_id = 132678 and standard_app_id=100361 )
    )
    
group by  eventAttr.tmp_id






















































### SQL 次日留存率计算方法及面试题解答 次日留存率是衡量用户在首次登录后的第二天是否继续使用产品的指标。它对于评估产品的吸引力和用户的粘性具有重要意义[^2]。以下是次日留存率的计算方法及相关SQL面试题的解答。 #### 1. 次日留存率的定义 次日留存率是指在某一天新增的用户中,有多少比例的用户在第二天再次登录系统。公式如下: \[ 次日留存率 = \frac{次日再次登录的用户数}{新增用户数} \times 100\% \] #### 2. 计算次日留存率的SQL实现 以下是一个通用的SQL实现方式,用于计算次日留存率: ```sql WITH FirstLogin AS ( -- 找出每个用户的首次登录时间 SELECT user_id, MIN(record_time) AS first_record_time FROM user_log GROUP BY user_id ), RetentionUsers AS ( -- 找出次日登录的用户 SELECT a.user_id, a.record_time FROM user_log a JOIN FirstLogin b ON a.user_id = b.user_id WHERE DATE(a.record_time) = DATE(DATE_ADD(b.first_record_time, INTERVAL 1 DAY)) ) -- 计算次日留存率 SELECT COUNT(DISTINCT RetentionUsers.user_id) AS next_day_retention_users, COUNT(DISTINCT FirstLogin.user_id) AS initial_users, ROUND(COUNT(DISTINCT RetentionUsers.user_id) / COUNT(DISTINCT FirstLogin.user_id) * 100, 2) AS next_day_retention_rate FROM FirstLogin LEFT JOIN RetentionUsers ON FirstLogin.user_id = RetentionUsers.user_id; ``` 上述代码通过两个CTE(Common Table Expressions)分别找出首次登录的用户和次日再次登录的用户,然后通过连接操作计算次日留存率[^4]。 #### 3. 面试题示例 **题目:** 给定一张记录用户登录信息的表`user_log`,包含字段`user_id`(用户ID)和`record_time`(登录时间)。请编写SQL查询,计算每天新增用户的次日留存率。 **解答:** ```sql WITH DailyNewUsers AS ( -- 找出每天新增的用户 SELECT user_id, record_time AS first_login_date FROM ( SELECT user_id, record_time, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY record_time) AS rn FROM user_log ) t WHERE rn = 1 ), NextDayLogins AS ( -- 找出次日登录的用户 SELECT a.user_id, a.record_time FROM user_log a JOIN DailyNewUsers b ON a.user_id = b.user_id WHERE DATE(a.record_time) = DATE(DATE_ADD(b.first_login_date, INTERVAL 1 DAY)) ) -- 计算每天新增用户的次日留存率 SELECT DATE(b.first_login_date) AS login_date, COUNT(DISTINCT a.user_id) AS next_day_retention_users, COUNT(DISTINCT b.user_id) AS new_users, ROUND(COUNT(DISTINCT a.user_id) / COUNT(DISTINCT b.user_id) * 100, 2) AS next_day_retention_rate FROM NextDayLogins a RIGHT JOIN DailyNewUsers b ON a.user_id = b.user_id GROUP BY DATE(b.first_login_date); ``` 此查询首先通过窗口函数`ROW_NUMBER()`找出每天新增的用户,然后计算这些用户在次日再次登录的比例[^3]。 --- ### 知识点总结 - **时间函数:** 使用`MIN()`、`DATE()`、`DATE_ADD()`等函数处理日期数据。 - **窗口函数:** 使用`ROW_NUMBER()`标记每个用户的首次登录记录。 - **连接操作:** 使用`JOIN`或`LEFT JOIN`将首次登录用户与次日登录用户进行匹配。 - **聚合函数:** 使用`COUNT()`统计用户数量,并结合`ROUND()`函数计算百分比。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值