【MySQL习题】各个视频的平均完播率【全网最详细教学】
目录
数据表描述
问题描述
输出示例
解题思路【重点】
正解代码
数据表描述
有以下两张表:
表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:2021年:我们在代码中就需要要求年份,而我们看看上面的表,他并没有年份这一列,但是在表1中他有一个用户开始观看时间和用户结束观看世界,以及表2中有一个视频的发布时间。在这三个时间中,他都是以年月日、时分秒来记录的,那我们就可以使用year函数,year函数就是从日期中截取年(同理,其实后面的月、日、时分秒都可以使用这类函数来截取)。现在知道怎么取年这个数据了,最后一个从哪儿取呢?正解:从表1的开始观看时间中截取
- 要求2:有播放记录的:有播放记录的,换句话说就是没有播放记录的就不用统计了。(这个要求,我们其实不用过多考虑,因为如果没有播放记录的话,表1中就没有这个数据)
- 要求3:每个视频的完播率:每个视频意思就是要按照视频id来进行分组,group by.
- 要求4:结果保留3位小数:需要我们使用一个round函数,这个函数就有两个参数,第一个参数是你给的数据,第二个参数是需要保留的小数位数。
- 要求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;
好啦,本期就到这里了,下期见~
相关文章:
【MySQL习题】各个视频的平均完播率【全网最详细教学】
目录 数据表描述 问题描述 输出示例 解题思路【重点】 正解代码 数据表描述 有以下两张表: 表1:用户-视频互动表tb_user_video_log 数据举例: 说明: uid-用户ID,video_id-视频ID start_time-开始观看时间end_time-结束观…...
Linux Centos配置邮件发送
Linux Centos配置邮件发送 这里使用的是外部发送邮件方式,也就是使用自己的账号发送 第一步 首先要开启STMP授权码,以QQ邮箱为例 配置文件 vim /etc/mail.rc找到之后在最下面添加如下 #邮箱set from3324855376qq.com #默认smtp发送,stmp…...
宋浩高等数学笔记(三)微分中值定理
首先是考研大纲包含的内容: 1.理解并会用罗尔(Rolle)定理、拉格朗日(Lagrange)中值定理和泰勒(Taylor)定理,了解并会用柯西(Cauchy)中值定理. 2.掌握用洛必达法则求未定式极限的方法. 3.理解函数的极值概念,掌握用导数判断函数的单调性和求函…...
华为认证 | 11月底这门HCIP认证即将发布!
非常荣幸地通知您,华为认证HCIP-Storage V5.5(中文版)预计将于2023年11月30日正式对外发布。为了帮助您做好学习、培训和考试计划,现进行预发布通知,请您关注。 01 发布概述 基于“平台生态”战略,围绕“云…...
U-Mail邮件系统安全登录解决方案
企业邮箱是企业对内对外商务往来的主要通信工具,并且企业邮箱里面还包含了大量企业内部隐私信息、商业机密等,很容易成为黑客的攻击目标。其中邮件盗号是企业邮箱遭受攻击的主要形式,一旦企业邮箱密码被黑客盗取,黑客不仅可以利用…...
在Java继承关系中变量访问规则
首先示例代码如下: class A{public int x 0;public int get() {return x;}}class AA extends A{public int x 1; }class AAA extends AA {public int x 2;public int get() {return x;}public static void main(String[] args) {A a new AA();System.out.pri…...
11. 一文快速学懂常用工具——网络工具(下)
本章讲解知识点 引言curltcpdumpwireshark本专栏适合于软件开发刚入职的学生或人士,有一定的编程基础,帮助大家快速掌握工作中必会的工具和指令。本专栏针对面试题答案进行了优化,尽量做到好记、言简意赅。如专栏内容有错漏,欢迎在评论区指出或私聊我更改,一起学习,共同进…...
什么GAN生成对抗网络?生成对抗网络可以干什么?
生成对抗网络(Generative Adversarial Nets,简称GAN)。神经网络分很多种,有普通的前向传播网络,有分析图片的CNN卷积神经网络,有分析系列化数据比如语言、文字的RNN循环神经网络,这些神经网络都是用来输入数据,得到想要的结果,我们看中的是这些神经网络中很好地将数据与…...
采集Prestashop独立站
这是一个用Lua编写的爬虫程序,用于采集Prestashop独立站的内容。爬虫程序使用代理信息:proxy_host: jshk.com.cn。 -- 首先,我们需要导入所需的库 local http require(socket.http) local url require(socket.url)-- 然后,我们…...
通过一道题目带你深入了解WAF特性、PHP超级打印函数、ASCII码chr()对应表等原理[RoarCTF 2019]Easy Calc 1
题目环境: 依此输入以下内容并查看回显结果 11 1’ index.php ls 到这里没思路了 F12查看源代码 一定要仔细看啊,差点没找到,笑哭 访问calc.php文件 果然有点东西 PHP代码审计 error_reporting(0);关闭错误报告 通过GET方式传参的参数num sho…...
类直径树上贪心
http://cplusoj.com/d/senior/p/SS231109C 场上想到枚举点,然后最大值为高,然后可以求最大值。但是感觉计数会重 计数其实不会重,如图中,红色线段显然比蓝色线段优 所以我们枚举3叉点时没错的 #include<bits/stdc.h> usin…...
求职招聘小程序源码系统+社交招聘+多城市招聘 带完整搭建教程
大家好,今天罗峰来给大家分享一款求职招聘小程序源码系统。目前,求职招聘市场在不断变革。传统的招聘网站已经无法满足人们对于高效、便捷、多元化的招聘需求。该系统集求职招聘、社交招聘、多城市招聘等功能于一体,旨在为用户提供更加便捷、…...
Java Web 安全实战:从登录到退出
Java Web 安全实战:从登录到退出 1. 介绍 在当今互联网时代,用户信息安全至关重要。在Java Web开发中,Spring Security是一个强大且灵活的身份验证和访问控制框架,它可以帮助我们构建安全可靠的应用程序。本文将介绍如何使用Spr…...
08.Diffusion Model数学原理分析(下)
文章目录 denoising matching term σ t z \sigma_tz σtz的猜想Diffusion Model for SpeechDiffusion Model for TextMask-Predict 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》,B站自行搜索。 书接上文。 denoising matching term E q ( x t ∣ x 0 …...
什么样的CRM系统更适合外贸企业?
外贸CRM系统作为外贸客户关系管理的工具,已经成为了当下外贸企业对外贸易过程中不可或缺的一环。那什么样的CRM系统更适合外贸企业?小Z向您推荐Zoho CRM。下面说说它到底有什么好处和作用。 一、搭建更高效的客户关系管理系统 外贸企业从前期推广、开发…...
selenium自动化测试入门 —— 键盘鼠标事件ActionChains
在使用 Selenium WebDriver 做自动化测试的时候,会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中,有一个专门的类来负责实现这些测试场…...
高级运维学习(十四)Zabbix监控(一)
一 监控概述 1 监控的目的 (1)报告系统运行状况 每一部分必须同时监控内容包括吞吐量、反应时间、使用率等 (2)提前发现问题 进行服务器性能调整前,知道调整什么找出系统的瓶颈在什么地方 2 监控的资源类别 …...
vite + electron引入itk报错
代码 import { readImageArrayBuffer } from itk-wasm console.log(readImageArrayBuffer)通过itk-wasm官网,创建新的项目vitevue(vue2或者vue3),都没问题。加入electeon后包此错。通过排查,意外找到原因,…...
大厂面试题-MySQL为什么使用B+Tree作为索引结构
从几个方面来回答: 首先,常规的数据库存储引擎,一般都是采用B树或者B树来实现索引的存储。 (如图)因为B树是一种多路平衡树,用这种存储结构来存储大量数据,它的整个高度会相比二叉树来说,会矮很多。 而对…...
Tomcat的Engine容器
https://tomcat.apache.org/tomcat-10.1-doc/config/engine.html Engine元素代表与一个特定的Catalina Service关联的、整体的请求处理系统。它从一个或多个Connector接收并处理请求、返回完整的响应给Connector,以便最终传输给客户端。 在Service元素内部…...
vscode里如何用git
打开vs终端执行如下: 1 初始化 Git 仓库(如果尚未初始化) git init 2 添加文件到 Git 仓库 git add . 3 使用 git commit 命令来提交你的更改。确保在提交时加上一个有用的消息。 git commit -m "备注信息" 4 …...
云原生核心技术 (7/12): K8s 核心概念白话解读(上):Pod 和 Deployment 究竟是什么?
大家好,欢迎来到《云原生核心技术》系列的第七篇! 在上一篇,我们成功地使用 Minikube 或 kind 在自己的电脑上搭建起了一个迷你但功能完备的 Kubernetes 集群。现在,我们就像一个拥有了一块崭新数字土地的农场主,是时…...
练习(含atoi的模拟实现,自定义类型等练习)
一、结构体大小的计算及位段 (结构体大小计算及位段 详解请看:自定义类型:结构体进阶-CSDN博客) 1.在32位系统环境,编译选项为4字节对齐,那么sizeof(A)和sizeof(B)是多少? #pragma pack(4)st…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
【磁盘】每天掌握一个Linux命令 - iostat
目录 【磁盘】每天掌握一个Linux命令 - iostat工具概述安装方式核心功能基础用法进阶操作实战案例面试题场景生产场景 注意事项 【磁盘】每天掌握一个Linux命令 - iostat 工具概述 iostat(I/O Statistics)是Linux系统下用于监视系统输入输出设备和CPU使…...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
Map相关知识
数据结构 二叉树 二叉树,顾名思义,每个节点最多有两个“叉”,也就是两个子节点,分别是左子 节点和右子节点。不过,二叉树并不要求每个节点都有两个子节点,有的节点只 有左子节点,有的节点只有…...
ip子接口配置及删除
配置永久生效的子接口,2个IP 都可以登录你这一台服务器。重启不失效。 永久的 [应用] vi /etc/sysconfig/network-scripts/ifcfg-eth0修改文件内内容 TYPE"Ethernet" BOOTPROTO"none" NAME"eth0" DEVICE"eth0" ONBOOT&q…...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
