题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。 示例:question_practice_detail id device_id quest_id result date 1 2138 111 wrong 2021-05-03 2 3214 112 wrong 2021-05-09 3 3214 113 wrong 2021-06-15 4 6543 111 right 2021-08-13 5 2315 115 right 2021-08-13 6 2315 116 right 2021-08-14 7 2315 117 wrong 2021-08-15 …… 根据示例,你的查询应返回以下结果: avg_ret 0.3000

区块链毕设网qklbishe.com为您提供问题的解答

题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。
示例:question_practice_detail
id device_id quest_id result date
1 2138 111 wrong 2021-05-03
2 3214 112 wrong 2021-05-09
3 3214 113 wrong 2021-06-15
4 6543 111 right 2021-08-13
5 2315 115 right 2021-08-13
6 2315 116 right 2021-08-14
7 2315 117 wrong 2021-08-15
……

根据示例,你的查询应返回以下结果:
avg_ret
0.3000

我是废物题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。          示例:question_practice_detail                             id                   device_id                   quest_id                   result                   date                             1                   2138                   111                   wrong                   2021-05-03                             2                   3214                   112                   wrong                      2021-05-09                             3                   3214                   113                   wrong                      2021-06-15                             4                   6543                   111                   right                   2021-08-13                             5                   2315                   115                   right                      2021-08-13                             6                   2315                   116                   right                      2021-08-14                             7                   2315                   117                   wrong                      2021-08-15                             ……                                                                                                                根据示例,你的查询应返回以下结果:                                     avg_ret                                  0.3000
36:22

翻遍了讨论区和解题去的答案,觉得这个解法是最好了。
SELECT COUNT(distinct q2.device_id,q2.date)/count(DISTINCT q1.device_id,q1.date) as avg_ret from question_practice_detail as q1 left outer join question_practice_detail as q2 on q1.device_id=q2.device_id and DATEDIFF(q2.date,q1.date)=1

思路是:

1. 需要知道两天都上线的人数
2. 需要知道第一天上线的人数
做法:
1. 用datediff区分第一天和第二天在线的device_id
2. 用left outer join做自表联结
3. 用distinct q2.device_id,q2.date做双重去重,找到符合条件的当天在线人数

41:36
想不出来,参考的 其实是牛哥大佬 的答案
做一下笔记
select avg(if(b.device_id is not null,1,0)) as avg_ret from  (select distinct device_id,date from question_practice_detail )a left join  ( select distinct device_id,date_sub(date,interval 1 day) as date  from question_practice_detail )b on a.device_id = b.device_id and a.date = b.date

DATE_SUB() 函数从日期减去指定的时间间隔。
代码中就是减去一天

原本日期
题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。          示例:question_practice_detail                             id                   device_id                   quest_id                   result                   date                             1                   2138                   111                   wrong                   2021-05-03                             2                   3214                   112                   wrong                      2021-05-09                             3                   3214                   113                   wrong                      2021-06-15                             4                   6543                   111                   right                   2021-08-13                             5                   2315                   115                   right                      2021-08-13                             6                   2315                   116                   right                      2021-08-14                             7                   2315                   117                   wrong                      2021-08-15                             ……                                                                                                                根据示例,你的查询应返回以下结果:                                     avg_ret                                  0.3000
date_sub(date,interval 1 day)

题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。          示例:question_practice_detail                             id                   device_id                   quest_id                   result                   date                             1                   2138                   111                   wrong                   2021-05-03                             2                   3214                   112                   wrong                      2021-05-09                             3                   3214                   113                   wrong                      2021-06-15                             4                   6543                   111                   right                   2021-08-13                             5                   2315                   115                   right                      2021-08-13                             6                   2315                   116                   right                      2021-08-14                             7                   2315                   117                   wrong                      2021-08-15                             ……                                                                                                                根据示例,你的查询应返回以下结果:                                     avg_ret                                  0.3000

left join 后
题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。          示例:question_practice_detail                             id                   device_id                   quest_id                   result                   date                             1                   2138                   111                   wrong                   2021-05-03                             2                   3214                   112                   wrong                      2021-05-09                             3                   3214                   113                   wrong                      2021-06-15                             4                   6543                   111                   right                   2021-08-13                             5                   2315                   115                   right                      2021-08-13                             6                   2315                   116                   right                      2021-08-14                             7                   2315                   117                   wrong                      2021-08-15                             ……                                                                                                                根据示例,你的查询应返回以下结果:                                     avg_ret                                  0.3000
思路就是找到隔天日期后还会来的同一个人,取平均值3/10

37:54
借鉴的到目前为止是2楼的答案,但加上自己的一些理解:(为简便,id=deviceid) 
1. 根据需求首先应该想到计算公式是什么,应该是 
   (滞后一天日期且前一天上线的唯一id的总数量) / (前一天上线的唯一id的总数量), 
   也就是用同id但是不同日期的数量进行相除 
   那么同时考虑id和日期的数量应该考虑同一个id在不同日期的组合 
   即count(distinct id, date) 
2. 那么第二个问题来了,数量有了,但是如何区分日期呢 
    那也就用到了datediff,则datediff(date1, date2) = 1即可 
3. 我们现在有了计算公式的基本元素,那么接下来应该如何执行计算呢 
    则需要连接两个表,为的就是能够将滞后一天日期的唯一id数量与前一天的进行错位 
    即select count(distinct q2.id, q2.date) / count(distinct q1.id, q1.date) as avg_reg 
        from 就这个表 as q1 
        left outer join 同样这个表 as q2 
        on q1.id = q2.id 
        and  datediff(date1, date2) = 1;
这里再说一下为什么要用left outer join,因为我们要保证分母的完整性,如果只用了join则会根据联结条件去除q1表中不符合条件的行,则最后结果应该会变成1(自己想的,不知道对不对),所以要用外联结。

27:21

select count(t2.date)/count(t1.date) from     (select distinct device_id,date from question_practice_detail) t1     left join      (select distinct device_id,date from question_practice_detail) t2     on t1.device_id = t2.device_id      and t2.date = date_add(t1.date,interval 1 day) 

47:09

思路:表的自联结

SELECT COUNT(b.device_id)/ COUNT(a.device_id) FROM(     SELECT DISTINCT device_id,date     FROM question_practice_detail ) as a LEFT JOIN (     SELECT DISTINCT device_id,DATE_SUB(date,interval 1 day) as date     FROM question_practice_detail ) as b ON a.date=b.date AND a.device_id=b.device_id

04:58

一、单独且完整的观察表中数据 可以看出4个用户在8天的时间里,产生了10种不同的答题模式(指不同时间且不同用户的情况),其中用户device_id:2315(以下简称2315) 在13、14、15号连续三天答题,那么用户2315就有两次的答题模式属于留存,再看用户device_id3214,其在15、16号两天答题,那么3214的留存模式就只有一次,其他用户没有留存模式。则在总共10总模式中,产生了2+1=3次留存模式,那么留存率就为3/10=0.3  这就是题目的意思吗?
二、平均概率的理解
 ①
如果这样是正确的话,那这个 “用户第二天还会再来的平均概率” 我觉得是个错误表述,否则应该计算每个用户的留存率,然后平均下来。比如说用户2315产生了两次留存,那么他的概率就是2/3(来了三天,其中有两天,这两天中每一天的前一天也是有来过的),同理,用户3214就为1/2. 其他用户为0 平均下来就是(2/3+1/2)/2=7/12.
②或者理解为用户2315在总共10次模式中,产生了2次,那么概率就为0.2  同理下 用户3214的概率就为0.1   那么平均概率就为(0.2+0.1)/2=0.15 
以上仅为个人不成熟的理解方式,欢迎各位大佬指正哈哈!

16:40

窗口函数的解法

select      count(id) / (select count(distinct device_id,date) from  question_practice_detail) as avg_ret from     (SELECT         a.device_id as id         ,a.date as date1          ,lead(a.date,1) over(partition by device_id order by a.date) as date2     from          (select distinct device_id,date from question_practice_detail) a     ) b where DATEDIFF(date2,date1) =1

03:56

SELECT      COUNT(q2.device_id) / COUNT(q1.device_id) AS avg_ret  FROM      (SELECT DISTINCT device_id, date FROM question_practice_detail)as q1 LEFT JOIN     (SELECT DISTINCT device_id, date FROM question_practice_detail) AS q2 ON q1.device_id = q2.device_id AND q2.date = DATE_ADD(q1.date, interval 1 day)

34:57
想不出怎么得到留存率,公式就把我难住了😣
49:49

select count(distinct b.device_id,b.date)/count(distinct a.device_id,a.date) as avg_ret from question_practice_detail a left JOIN question_practice_detail b on a.date = b.date-1 and a.device_id = b.device_id 

先用左连接,可以得到第一天回答但是第二天没有回答的记录,然后通过count,并且通过和device_id和日期进行去重

35:11
select count(date2)/count(date) as avg_ret from

 #第一天用户

(select distinct device_id,date from question_practice_detail) a left join
#第二天用户,用date_sub把第二天的日期改为第一天的日期,从而把第二天的数据匹配到第一天上
(select distinct device_id,date_sub(date,interval 1 day) date2 from question_practice_detail) b on a.device_id=b.device_id and a.date=b.date2; 

#只有在满足两个限定条件的情况下,date2才能匹配出数值,不能匹配的情况下,即第二天没有刷题,date2 is null
#计算用户的平均次日留存率

00:02
这是非技术的SQL么🤓
30:49

这道题确实有些难,吐槽一下真的要实现这个功能我宁愿写两个SQL查出来再进行计算,性能差也比花半天时间来写强

思路

  1. 首先要搞明白这个概率的计算,不然无从下手
    概率=(去重后的用户有连续两天刷题记录次数)/(去重日期用户后刷题记录次数)
  2. 最好先写成两句SQL,分别查出分母和分子的记录数,然后用子查询结合起来就好了

    SQL1

    1.1 先来找有连续两天刷题的记录,显然单靠本表查询是做不到的,这里应该用到自连接
    1.2 自关联后要进行根据日期和device_id进行进一步筛选,然后求count得到分子
    (这里建议将案例sql复制到MySQL数据库一点点查着写,就清楚了,语言描述还是苍白无力)

    select count(distinct q3.date,q3.device_id) from (select q1.device_id,q1.date from question_practice_detail q1 left join question_practice_detail q2 on q1.device_id = q2.device_id where date_add(q1.date,interval 1 day)=q2.date) q3;

    sql2

    2.1 对原表进行查询,采用相同的手段进行去重,最后再求count得到分母

    select count(DISTINCT date,device_id) from question_practice_detail;

    子查询

    这题之所以用子查询是因为非要一个SQL计算出结果的无奈之举。目的是为了把上面两句SQL结果在一句SQL用起来进行计算。我是将SQL1作为子SQL的。
    ps:子查询最好多结合别名来使用

    select q5.times/count(DISTINCT q4.date,q4.device_id) avg_ret from question_practice_detail q4, (select count(distinct q3.date,q3.device_id) times from (select  q1.device_id,q1.date from  question_practice_detail q1 left join question_practice_detail q2 on q1.device_id = q2.device_id where date_add(q1.date,interval 1 day)=q2.date) q3) q5;
52:05
直接裂开,我只想做个小运营,这个以后工作了只能靠自己去取数了吗😭,2年没数学的我完全没思路
18:48
参考了答案之后,按自己理解的写的,有点长,但是好理解:
1.题目没有展示完整的表,自己用select * from 原表,就会发现有的用户,同一天做了好几次题目,所以要把device_id,date一起去重,剔除同一用户同一天做题的重复项;2.去重之后,用datediff函数,同样的表查交集,得出第一天做题之后第二天也做题的表,用count(*)得出符合题目条件的行数;3.用步骤2的行数除以步骤1去重后的行数,就是题目所求。
select (select count(*) 

from (select distinct device_id,date from question_practice_detail) t1
inner join (select distinct device_id,date from question_practice_detail) t2
on t1.device_id=t2.device_id
where datediff(t2.date,t1.date)=1)/(select count(*) from  (select distinct device_id,date from question_practice_detail) t3) avg_ret

05:51
唉,要是这种题目有算出avg_ret公式或者解法就好了。
40:11

根据恶作剧之神阿蒙的笔记提供思路:(还没有学习窗口函数。根据该答案理解思路,对不理解部分用类似方式验证(AVG与COUNT),或者用 * 梳理理解框架,最后进行倒退
1、框架:将原表拆分为两个表。a:device_id,date;b:device_id,date_sub(date,interval 1 day)as date from question_practice_detail
难以理解的为标粗体部分。
1)首先理解公式部分的含义:取DATE中的日期间隔1天的日期来自于原表
2)可以用vlookup思维进行理解,如果原表中不包含即为null,null即代表该用户未连续刷题。
2、问题:avg与count的使用,延伸问题为什么使用count(b.device_id)/ count(a.device_id)得出的结果一致呢?
1)解释3个公式
公式1(avg:已知拆分为两个表,如果b表中的device_id不为空值,记为1求平均数)
avg(if(b.device_id is not null,1,0)) as avg_ret

可写为公式2(count:已知拆分为两个表,如果b表中的device_id不为空值,记为1/总数

count(if(b.device_id is not null,1,null)) / count(a.device_id) as avg_ret 
框架1中已解释:b表中含日期的为连续刷题用户,没有连续刷题用户为null,在根据公式2进行理解。 公式3:count(b.device_id)/ count(a.device_id) 

54:09

想了好久的新思路,希望能帮助到你们。
先用窗口函数将用户分组并且根据时间排序(记得用distinct把每天重复的去重)
select distinct device_id, date n_date, dense_rank()over(partition by device_id order by date) t_r from question_practice_detail) a) rt

再用偏移窗口函数把上面的日期顺序向下偏移一格,组合起来就是

select a.device_id,a.n_date,        lead(a.n_date,1)over(partition by device_id order by a.n_date) t_date from (select distinct device_id, date n_date,       dense_rank()over(partition by device_id order by date) t_r      from question_practice_detail) a

最后进行判断即可,完整公式如下:

select sum(if(rt.n_date=date_sub(rt.t_date,interval 1 day),1,0))/count(*) from (select a.device_id,a.n_date,        lead(a.n_date,1)over(partition by device_id order by a.n_date) t_date from (select distinct device_id, date n_date,                    dense_rank()over(partition by device_id order by date) t_r     from question_practice_detail) a) rt

41:26

自己想出来的一种更简便更好理解的解法
第一步我们把同一天的同一用户去重,
第二步我们做有条件的sum求和,
从这个新的表里拿出每一天的数据,看它之后的一天是否也在原表中有数据
有则代表他次日留存了,记1,没有则记0,
第三步我们把留存数除以访问总数count(*)即可

这里没有除直接用了一个avg是一样的结果
select avg(if(date_add(date, interval 1 day) in  (select date from question_practice_detail t2 where t1.device_id = t2.device_id),1,0)) as avg_ret from (select distinct device_id, date from question_practice_detail) t1

23:23

以上就是关于问题题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。
示例:question_practice_detail id device_id quest_id result date 1 2138 111 wrong 2021-05-03 2 3214 112 wrong
2021-05-09 3 3214 113 wrong
2021-06-15 4 6543 111 right 2021-08-13 5 2315 115 right
2021-08-13 6 2315 116 right
2021-08-14 7 2315 117 wrong
2021-08-15 ……

根据示例,你的查询应返回以下结果: avg_ret 0.3000的答案

欢迎关注区块链毕设网-
专业区块链毕业设计成品源码,定制。

区块链NFT链游项目方科学家脚本开发培训

从业7年-专注一级市场


微信:btc9767
TELEGRAM :https://t.me/btcok9

具体资料介绍

web3的一级市场千万收益的逻辑


进群点我



qklbishe.com区块链毕设代做网专注|以太坊fabric-计算机|java|毕业设计|代做平台-javagopython毕设 » 题目:现在运营想要查看用户在某天刷题后第二天还会再来刷题的平均概率。请你取出相应数据。 示例:question_practice_detail id device_id quest_id result date 1 2138 111 wrong 2021-05-03 2 3214 112 wrong 2021-05-09 3 3214 113 wrong 2021-06-15 4 6543 111 right 2021-08-13 5 2315 115 right 2021-08-13 6 2315 116 right 2021-08-14 7 2315 117 wrong 2021-08-15 …… 根据示例,你的查询应返回以下结果: avg_ret 0.3000