【MySQL习题】各个视频的平均完播率【全网最详细教学】

news2025/1/16 13:50:33

目录

数据表描述

问题描述

输出示例

解题思路【重点】

正解代码 


数据表描述

有以下两张表:

表1:用户-视频互动表tb_user_video_log

数据举例:

 说明:

  • uid-用户ID,
  • video_id-视频ID
  •  start_time-开始观看时间
  • end_time-结束观看时间
  •  if_follow-是否关注
  •  if_like-是否点赞
  • if_retweet-是否转发
  •  comment_id-评论ID

表2:短视频信息表tb_video_info

数据举例:

说明:

  • video_id-视频ID
  • author-创作者ID
  • tag-类别标签
  • duration-视频时长(秒)
  • release_time-发布时间

问题描述

        计算2021年里有播放记录的每个视频的完播率(结果保留三位小数),并按完播率降序排序

:视频完播率是指完成播放次数占总播放次数的比例。简单起见,结束观看时间与开始播放时间的差>=视频时长时,视为完成播放。


输出示例

说明:

        视频id2001在2021年10月有3次播放记录,观看时长分别为30秒、24秒、34秒,视频时长30秒,因此有两次是被认为完成播放了的,故完播率为0.667;

        视频id2002在2021年9月和10月共2次播放记录,观看时长分别为42秒、30秒,视频时长60秒,故完播率为0.000。


解题思路【重点】

        首先,我们来分解问题:

各个要求如何解:

  1. 要求1:2021年:我们在代码中就需要要求年份,而我们看看上面的表,他并没有年份这一列,但是在表1中他有一个用户开始观看时间和用户结束观看世界,以及表2中有一个视频的发布时间。在这三个时间中,他都是以年月日、时分秒来记录的,那我们就可以使用year函数,year函数就是从日期中截取年(同理,其实后面的月、日、时分秒都可以使用这类函数来截取)。现在知道怎么取年这个数据了,最后一个从哪儿取呢?正解:从表1的开始观看时间中截取
  2. 要求2:有播放记录的:有播放记录的,换句话说就是没有播放记录的就不用统计了。(这个要求,我们其实不用过多考虑,因为如果没有播放记录的话,表1中就没有这个数据)
  3. 要求3:每个视频的完播率:每个视频意思就是要按照视频id来进行分组,group by.
  4. 要求4:结果保留3位小数:需要我们使用一个round函数,这个函数就有两个参数,第一个参数是你给的数据,第二个参数是需要保留的小数位数。
  5. 要求5:按完播率降序排序。最终的结果降序,order by desc.

回顾,MySQL中各个关键字的执行顺序:

from>on>join>where>group by>with>having>select>distinct>order by>limit 

        我们接下来,就根据这个关键字顺序来写:

  • 第一个是from:就是查什么表嘛,我们在这里是查,两张表:用户-视频互动表和短视频信息表。代码:
from tb_user_video_log a,tb_video_info b
#顺便给重命名了一下
  • 第二、三个是on、join,咱们现在先不看了
  • 第四个是where:就是给出两张表汇总后的限制条件,第一个就是两张表笛卡尔积后,只取数据的视频id相等的数据;根据上述分析要求观看年份是2021的数据。代码:
from tb_user_video_log a,tb_video_info b
where a.video_id = b.video_id and year(start_time) = 2021
  • 第五个是group by:根据上述分析,要求要按照不同的视频id进行分组。代码:
from tb_user_video_log a,tb_video_info b
where a.video_id = b.video_id and year(start_time) = 2021
group by a.video_id
  • 第六、七个是 with、having,咱们就不用看了
  • 第八个是select:select后面跟的是要输出的字段是什么?我们根据上面的输出示例可知,输出字段有两个,一个是视频id,另一个是该视频对应的完播率。视频id好说,那视频完播率我们怎么计算呢?首先我们上面已经写出来的代码,我们可以知道我们已经把两个表的数据整合到一起了,并且按照视频id已经做出了分组。我们现在就只需要计算每个组的完播率的视频个数除以这个组视频的总数,就是这个组的完播率了。计算完播率个数,我们可以使用sum函数,sum函数中再嵌套一个if关键字mysql的if关键字的使用:if(参1,参2,参3)参数1就是一个判断,为真还是假;为真时取第二个参数的值,为假时取第三个参数的值】;计算这个组的总视频个数使用count(*)就可以了。计算出这个组的完播率后,我们在最外层套一个round函数,就可以了。最后给计算出完播率的这一部分取个名字,就是as avg_comp_play_rate。代码:
select a.video_id,
    round(sum(if(end_time - start_time >= duration,1,0))/count(*),3)
 as avg_comp_play_rate
from tb_user_video_log a,tb_video_info b
where a.video_id = b.video_id and year(start_time) = 2021
group by a.video_id
  • 第九个distinct就不看了
  • 第十个是order by:排序,根据上述要求需要对最终的结果按照完播率来降序排序。代码:
select a.video_id,
    round(sum(if(end_time - start_time >= duration,1,0))/count(*),3)
 as avg_comp_play_rate
from tb_user_video_log a,tb_video_info b
where a.video_id = b.video_id and year(start_time) = 2021
group by a.video_id
order by avg_comp_play_rate desc;
  • 第十一个是limit,这里就不看了,用不上~

所有代码就结束了,拿去运行就可以了~


正解代码

select a.video_id,
    round(sum(if(end_time - start_time >= duration,1,0))/count(*),3)
 as avg_comp_play_rate
from tb_user_video_log a,tb_video_info b
where a.video_id = b.video_id and year(start_time) = 2021
group by a.video_id
order by avg_comp_play_rate desc;

或者: 

select a.video_id,
    round(sum(if(end_time - start_time >= duration,1,0))/count(*),3)
 as avg_comp_play_rate
from tb_user_video_log a left join tb_video_info b on a.video_id = b.video_id
where year(start_time) = 2021
group by a.video_id
order by avg_comp_play_rate desc;

好啦,本期就到这里了,下期见~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1192009.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序报request:fail url not in domain list的解决方法

情况1:未设置合法域名 解决方法:请在微信公众平台登录小程序后台 > 开发管理 > 开发设置 > 服务器域名 情况2:设置了合法域名,开发工具仍然报错 解决方法: 在右上角点击详情,之后刷新一下项目配置,看看有…

一篇博客读懂单链表——Single-List

目录 一、初识单链表 单链表是如何构造的: 单链表如何解决顺序表中的问题: 二、单链表的初始定义 三、尾插和头插 3.1 新建结点CreateNode 3.2 打印SLTPrint 3.3 尾插SLTPushBack 3.4 头插SLTPushFront 四、尾删和头删 4.1 尾删SLTPopBack…

容器数据卷+MYSQL实战

什么是容器数据卷? 让我们回忆一下docker理念: 就是将应用和环境打包成一个镜像 数据? 如果数据都在容器中,那么我们删除容器,数据就会丢失 !需求:数据持久化就完美了 对于MYSQL&#xff0…

玄子Share-Git 入门手册

玄子Share-Git 入门手册 简单介绍 Git Git 是一个自由和开源的分布式版本控制系统,旨在快速和高效地处理从小型到大型的所有项目 Git 简单易学,占用空间小,性能快如闪电。它比Subversion、CVS、Perforce和ClearCase等SCM工具更有优势&…

python默认的输入类型是字符串,怎样转换为其他的类型

在Python中,默认的输入类型是字符串(str类型)。无论你输入的是数字、字符还是其他类型的内容,input函数都会将其作为字符串处理并返回。 如果需要将字符串转换为其他类型(如整数、浮点数等),可…

kafka和rocketMq的区别

kafka topic 中每一个分区会有 Leader 与 Follow。Kafka 的内部机制可以保证 topic 某一个分区的 Leader 与 Follow 不在同一台机器上 Leader 节点承担一个分区的读写,Follow 节点只负责数据备份 如果 Leader 分区所在的 Broker 节点宕机,会触发主从节…

Linux 的热插拔机制通过 Udev(用户空间设备)实现、守护进程

一、Udev作用概述 udev机制简介udev工作流程图 二、Linux的热拔插UDEV机制 三、守护进程 守护进程概念守护进程在后台运行基本特点 四、守护进程和后台进程的区别 一、Udev作用概述 udev机制简介 Udev(用户空间设备)是一个 Linux 系统中用于动态管…

玄子Share-HTML5知识手册

玄子Share-HTML5知识手册 前言: 这一版 HTML 笔记,算是我写的第四版了,第三版对照课本编写,第四版则是对照 MDN 官方文档编写,不论是术语亦或专业性,都更上一层 文章依托 MDN 文档,拓展了大量课…

【2023-11-09】git使用随记——gitignore文件配置某些文件忽略

git使用随记——gitignore文件配置某些文件忽略 通过git进行版本控制在项目中是非常常见的,一些项目构建上的文件通常是不需要进行版本控制的,也就无需推送到git仓库中,比如前端项目中的node_module目录。提供配置.gitignore文件 但是某些情…

腾讯云88,阿里云99,现在都这么卷了吗?!

你是否曾经想过,云服务器的价格竟然可以如此亲民?现在,腾讯云和阿里云竟然都推出了超低价位的云服务器,只要88元和99元!这让我们这些自媒体人、创业者、开发者等都感到非常惊喜。可以看一下配置和价格: 可…

MATLAB中Line 属性说明

目录 颜色和样式 位置 Line 属性是注释线条的外观和行为。 Line 属性控制 Line 对象的外观和行为。通过更改属性值,可以修改线条的特定方面。使用圆点表示法查询和设置属性。 h annotation("line"); c h.Color; h.Color "red"; 颜色和样…

边缘计算如何改变数据存储?

边缘计算在整个价值链中提供多种优势——从降低成本到提高效率再到安全数据传输。该技术允许在源头收集和分析相关数据,这有助于减少延迟和带宽成本,同时显著提高计算过程的冗余系数和效率。 通过降低数据传输成本和损失,边缘计算帮助企业实现…

docker更改存储目录原因及方案

为什么一定要将docker的存储目录挂载到其他目录 docker在安装时默认存储目录在/var/lib/docker,而该目录是在系统盘下的。docker安装后,会使用各种各样的镜像,动辄几个G,那么如此多的镜像文件,装着装着系统盘就撑爆了…

【AI】自回归 (AR) 模型使预测和深度学习变得简单

自回归 (AR) 模型是统计和时间序列模型,用于根据数据点的先前值进行分析和预测。这些模型广泛应用于各个领域,包括经济、金融、信号处理和自然语言处理。 自回归模型假设给定时间变量的值与其过去的值线性相关,这使得它们可用于建模和预测时…

【Unity细节】Unity中的Transform.SetParent还有你不知道的细节

👨‍💻个人主页:元宇宙-秩沅 hallo 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 秩沅 原创 😶‍🌫️收录于专栏:unity细节和bug 😶‍🌫️优质专栏 ⭐【…

除了鲁大师,你还可以装这些。

无论是专业的电脑维护人员,还是只是一个简单的 DIY 兴趣爱好者,有的时候都会或多或少遇到一些电脑硬件的问题。 这种情况下,如果特地去安装一款专门的检测软件,肯定会非常麻烦。 一般来说,检测电脑硬件,使…

【解刊】可投!Elsevier旗下1/2区SCI,4天见刊!

计算机类 • 好刊解读 今天小编带来Elsevier旗下计算机领域好刊的解读,如有相关领域作者有意向投稿,可作为重点关注!后文有同领域快刊发表案例,供您投稿参考~ 01 期刊简介 Sustainable Computing: Informatics and Systems ☑️…

内存卡数据恢复,5 个免费好用的数据恢复方法工具全解

丢失了 SD 卡中的一些重要照片或文档,并且不知道如何恢复?好吧,别担心!!以下是一些适用于 Windows 的最佳 SD 卡恢复工具,可增加您检索意外删除、丢失或丢失数据的机会。 什么是 SD 卡数据恢复软件&#xf…

ps 让图片附着在文字上

按住alt在文字与图片图片中间,文字在图片下面)

Scala中编写多线程爬虫程序并做可视化处理

目录 一、引言 二、Scala爬虫程序的实现 1、引入必要的库 2、定义爬虫类 3、可视化处理 三、案例分析:使用Scala爬取并可视化处理电影数据 1、定义爬虫类 2、实现爬虫程序的控制逻辑 3、可视化处理电影数据 四、总结 一、引言 随着互联网的快速发展&#…