当前位置: 首页 > news >正文

【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. 要求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;

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

相关文章:

【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 场上想到枚举点&#xff0c;然后最大值为高&#xff0c;然后可以求最大值。但是感觉计数会重 计数其实不会重&#xff0c;如图中&#xff0c;红色线段显然比蓝色线段优 所以我们枚举3叉点时没错的 #include<bits/stdc.h> usin…...

求职招聘小程序源码系统+社交招聘+多城市招聘 带完整搭建教程

大家好&#xff0c;今天罗峰来给大家分享一款求职招聘小程序源码系统。目前&#xff0c;求职招聘市场在不断变革。传统的招聘网站已经无法满足人们对于高效、便捷、多元化的招聘需求。该系统集求职招聘、社交招聘、多城市招聘等功能于一体&#xff0c;旨在为用户提供更加便捷、…...

Java Web 安全实战:从登录到退出

Java Web 安全实战&#xff1a;从登录到退出 1. 介绍 在当今互联网时代&#xff0c;用户信息安全至关重要。在Java Web开发中&#xff0c;Spring Security是一个强大且灵活的身份验证和访问控制框架&#xff0c;它可以帮助我们构建安全可靠的应用程序。本文将介绍如何使用Spr…...

08.Diffusion Model数学原理分析(下)

文章目录 denoising matching term σ t z \sigma_tz σt​z的猜想Diffusion Model for SpeechDiffusion Model for TextMask-Predict 部分截图来自原课程视频《2023李宏毅最新生成式AI教程》&#xff0c;B站自行搜索。 书接上文。 denoising matching term E q ( x t ∣ x 0 …...

什么样的CRM系统更适合外贸企业?

外贸CRM系统作为外贸客户关系管理的工具&#xff0c;已经成为了当下外贸企业对外贸易过程中不可或缺的一环。那什么样的CRM系统更适合外贸企业&#xff1f;小Z向您推荐Zoho CRM。下面说说它到底有什么好处和作用。 一、搭建更高效的客户关系管理系统 外贸企业从前期推广、开发…...

selenium自动化测试入门 —— 键盘鼠标事件ActionChains

在使用 Selenium WebDriver 做自动化测试的时候&#xff0c;会经常模拟鼠标和键盘的一些行为。比如使用鼠标单击、双击、右击、拖拽等动作&#xff1b;或者键盘输入、快捷键使用、组合键使用等模拟键盘的操作。在 WebDeriver 中&#xff0c;有一个专门的类来负责实现这些测试场…...

高级运维学习(十四)Zabbix监控(一)

一 监控概述 1 监控的目的 &#xff08;1&#xff09;报告系统运行状况 每一部分必须同时监控内容包括吞吐量、反应时间、使用率等 &#xff08;2&#xff09;提前发现问题 进行服务器性能调整前&#xff0c;知道调整什么找出系统的瓶颈在什么地方 2 监控的资源类别 …...

vite + electron引入itk报错

代码 import { readImageArrayBuffer } from itk-wasm console.log(readImageArrayBuffer)通过itk-wasm官网&#xff0c;创建新的项目vitevue&#xff08;vue2或者vue3&#xff09;&#xff0c;都没问题。加入electeon后包此错。通过排查&#xff0c;意外找到原因&#xff0c;…...

大厂面试题-MySQL为什么使用B+Tree作为索引结构

从几个方面来回答&#xff1a; 首先&#xff0c;常规的数据库存储引擎&#xff0c;一般都是采用B树或者B树来实现索引的存储。 (如图)因为B树是一种多路平衡树&#xff0c;用这种存储结构来存储大量数据&#xff0c;它的整个高度会相比二叉树来说&#xff0c;会矮很多。 而对…...

Tomcat的Engine容器

https://tomcat.apache.org/tomcat-10.1-doc/config/engine.html Engine元素代表与一个特定的Catalina Service关联的、整体的请求处理系统。它从一个或多个Connector接收并处理请求、返回完整的响应给Connector&#xff0c;以便最终传输给客户端。 在Service元素内部&#xf…...

国防科技大学计算机基础课程笔记02信息编码

1.机内码和国标码 国标码就是我们非常熟悉的这个GB2312,但是因为都是16进制&#xff0c;因此这个了16进制的数据既可以翻译成为这个机器码&#xff0c;也可以翻译成为这个国标码&#xff0c;所以这个时候很容易会出现这个歧义的情况&#xff1b; 因此&#xff0c;我们的这个国…...

【kafka】Golang实现分布式Masscan任务调度系统

要求&#xff1a; 输出两个程序&#xff0c;一个命令行程序&#xff08;命令行参数用flag&#xff09;和一个服务端程序。 命令行程序支持通过命令行参数配置下发IP或IP段、端口、扫描带宽&#xff0c;然后将消息推送到kafka里面。 服务端程序&#xff1a; 从kafka消费者接收…...

应用升级/灾备测试时使用guarantee 闪回点迅速回退

1.场景 应用要升级,当升级失败时,数据库回退到升级前. 要测试系统,测试完成后,数据库要回退到测试前。 相对于RMAN恢复需要很长时间&#xff0c; 数据库闪回只需要几分钟。 2.技术实现 数据库设置 2个db_recovery参数 创建guarantee闪回点&#xff0c;不需要开启数据库闪回。…...

云计算——弹性云计算器(ECS)

弹性云服务器&#xff1a;ECS 概述 云计算重构了ICT系统&#xff0c;云计算平台厂商推出使得厂家能够主要关注应用管理而非平台管理的云平台&#xff0c;包含如下主要概念。 ECS&#xff08;Elastic Cloud Server&#xff09;&#xff1a;即弹性云服务器&#xff0c;是云计算…...

解决Ubuntu22.04 VMware失败的问题 ubuntu入门之二十八

现象1 打开VMware失败 Ubuntu升级之后打开VMware上报需要安装vmmon和vmnet&#xff0c;点击确认后如下提示 最终上报fail 解决方法 内核升级导致&#xff0c;需要在新内核下重新下载编译安装 查看版本 $ vmware -v VMware Workstation 17.5.1 build-23298084$ lsb_release…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

【ROS】Nav2源码之nav2_behavior_tree-行为树节点列表

1、行为树节点分类 在 Nav2(Navigation2)的行为树框架中,行为树节点插件按照功能分为 Action(动作节点)、Condition(条件节点)、Control(控制节点) 和 Decorator(装饰节点) 四类。 1.1 动作节点 Action 执行具体的机器人操作或任务,直接与硬件、传感器或外部系统…...

第25节 Node.js 断言测试

Node.js的assert模块主要用于编写程序的单元测试时使用&#xff0c;通过断言可以提早发现和排查出错误。 稳定性: 5 - 锁定 这个模块可用于应用的单元测试&#xff0c;通过 require(assert) 可以使用这个模块。 assert.fail(actual, expected, message, operator) 使用参数…...

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

自然语言处理——Transformer

自然语言处理——Transformer 自注意力机制多头注意力机制Transformer 虽然循环神经网络可以对具有序列特性的数据非常有效&#xff0c;它能挖掘数据中的时序信息以及语义信息&#xff0c;但是它有一个很大的缺陷——很难并行化。 我们可以考虑用CNN来替代RNN&#xff0c;但是…...