【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;

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

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Python3】【力扣题】258. 各位相加

【力扣题】题目描述: 【Python3】代码: 1、解题思路:将整数转为字符串,遍历字符串中的数字,求和。 知识点:str(...):转为字符串。为了遍历每个数字。 int(...):转为整数。为了数字…

三菱FX3U系列-定位指令

目录 一、简介 二、指令形式 1、相对定位[DRVI、DDRVI] 2、绝对定位[DRVA、DDRVA] 三、总结 一、简介 定位指令用于控制伺服电机或步进电机的位置移动。可以通过改变脉冲频率和脉冲数量来控制电机的移动速度和移动距离,同时还可以指定移动的方向。 二、指令形…

带你一分钟看懂 “kubernetes”

目录 什么是 Kubernetes Kubernetes 概述 为什么需要 Kubernetes,它能做什么? 什么是 Kubernetes 从官方网站上可以看到,它是一个工业级的容器编排平台。Kubernetes 这个单词是希腊语,它的中文翻译是“舵手”或者“飞行员”。在…

互联网金融P2P主业务场景自动化测试

互联网金融P2P行业,近三年来发展迅速,如火如荼。 据不完全统计,全国有3000的企业。 “互联网”企业,几乎每天都会碰到一些奇奇怪怪的bug,作为在互联网企业工作的测试人员,风险和压力都巨大。那么我们如何降…

python用tkinter随机数猜数字大小

python用tkinter随机数猜数字大小 没事做,看到好多人用scratch做的猜大小的示例,也用python的tkinter搞一个猜大小的代码玩玩。 猜数字代码 from tkinter import * from random import randint# 定义确定按钮的点击事件 def hit(x,y):global s_Labprint(…

CCF ChinaSoft 2023 论坛巡礼 | 云计算标准化论坛

2023年CCF中国软件大会(CCF ChinaSoft 2023)由CCF主办,CCF系统软件专委会、形式化方法专委会、软件工程专委会以及复旦大学联合承办,将于2023年12月1-3日在上海国际会议中心举行。 本次大会主题是“智能化软件创新推动数字经济与社…

DHorse(K8S的CICD平台)的实现原理

综述 首先,本篇文章所介绍的内容,已经有完整的实现,可以参考这里。 在微服务、DevOps和云平台流行的当下,使用一个高效的持续集成工具也是一个非常重要的事情。虽然市面上目前已经存在了比较成熟的自动化构建工具,比如…

this.$message提示内容添加换行

0 效果 1 代码 let msgArr [只允许上传doc/docx/xls/xlsx/pdf/png/jpg/bmp/ppt/pptx/rar/zip格式文件,且单个文件大小不能超过20MB,已过滤无效的文件] let msg msgArr.join(<br/>) this.$message({dangerouslyUseHTMLString: true,message: msg,type: warning })

linux系统,确认账户密码正确

linux系统&#xff0c;确认账户密码正确 1、问题背景2、解决方法 1、问题背景 有时在linux系统安装软件时&#xff0c;有的软件可能会在安装过程中创建系统用户&#xff0c;同时会给出这个用户的密码。过了一段时间我们不确定这个密码是否还正确&#xff0c;那怎么确认这个密码…

适用于 iOS 的 10 个最佳数据恢复工具分享

在当今的数字时代&#xff0c;我们的移动设备占据了我们生活的很大一部分。从令人难忘的照片和视频到重要的文档和消息&#xff0c;我们的 iOS 设备存储了大量我们无法承受丢失的数据。然而&#xff0c;事故时有发生&#xff0c;无论是由于软件故障、无意删除&#xff0c;甚至是…

centos 7.9系统安装老版本jenkins,并解决插件问题

1.初衷 因为jenkins随着时间推移&#xff0c;其版本也越来越新&#xff0c;支持它运行的JDK也越来越新。基于不折腾的目标&#xff0c;我们安装一个老的固定版本就行。以前安装新版本&#xff0c;经常碰到的问题就是插件安装不兼容的问题。现在这个问题&#xff0c;可以把以前…

CentOS7安装部署StarRocks

文章目录 CentOS7安装部署StarRocks一、前言1.简介2.环境 二、正文1.StarRocks基础1&#xff09;架构图2&#xff09;通讯端口 2.部署服务器3.安装基础环境1&#xff09;安装JDK 112&#xff09;修改机器名3&#xff09;安装GCC4&#xff09;关闭交换分区&#xff08;swap&…

【机器学习】给大家推荐几个资源

我写博客的目的就是让大家了解人工智能背后的数学原理&#xff0c;但人工智能这个话题太大了&#xff0c;背后涉及到的知识非常庞大&#xff0c;仅靠写几篇文章传播力度有限&#xff0c;况且知识传播过程中也容易引入误解&#xff0c;所以授之以鱼不如授之以渔&#xff0c;这里…

Facebook广告被暂停是什么原因?广告账号被封怎么办?

许多做海外广告投放的小伙伴经常遇到一个难题&#xff0c;那就是投放的Facebook广告被拒或广告帐户被关闭赞停的经历&#xff0c;随之而来的更可能是广告账户被封&#xff0c;导致资金的损失。本文将从我自身经验&#xff0c;为大家分享&#xff0c;FB广告被暂停的原因有哪些&a…

什么是伺服电机?Parker派克伺服电机盘点

一、什么是伺服电机&#xff1f; 要准确地定义伺服电机&#xff0c;我们首先需理解其核心特性&#xff1a;反馈与闭环控制。伺服电机凭借这些特性&#xff0c;能精确控制扭矩、速度或位置&#xff0c;即使在零速度下&#xff0c;也能保持足够的扭矩以锁定负载。 伺服电机与其…

Elastic Stack 8.11:引入一种新的强大查询语言 ES|QL

作者&#xff1a;Tyler Perkins, Ninoslav Miskovic, Gilad Gal, Teresa Soler, Shani Sagiv, Jason Burns Elastic Stack 8.11 引入了数据流生命周期、一种配置数据流保留和降采样&#xff08;downsampling&#xff09; 的简单方法&#xff08;技术预览版&#xff09;&#xf…

电梯用电量-第10届蓝桥杯国赛Python真题精选

[导读]&#xff1a;超平老师的Scratch蓝桥杯真题解读系列在推出之后&#xff0c;受到了广大老师和家长的好评&#xff0c;非常感谢各位的认可和厚爱。作为回馈&#xff0c;超平老师计划推出《Python蓝桥杯真题解析100讲》&#xff0c;这是解读系列的第8讲。 电梯用电量&#x…

学者观察 | 数字经济中长期发展中的区块链影响力——清华大学柴跃廷

导语 区块链是一种全新的分布式基础架构与计算范式&#xff0c;既能利用非对称加密和冗余分布存储实现信息不可篡改&#xff0c;又可以利用链式数据结构实现数据信息可溯源。当前&#xff0c;区块链技术已成为全球数据交易、金融结算、国际贸易、政务民生等领域的信息基础设施…

怎么抓取下载(导出)文件的接口

最近在做接口测试&#xff0c;用浏览器的F12在抓取接口时&#xff0c;发现下载&#xff08;导出&#xff09;是新开了一个页面去导出&#xff0c;导出成功又自动消失了&#xff0c;所以这种新开窗口去导出&#xff0c;在原先的窗口的F12是抓不到的。那么针对这种跨页面的下载的…

LeetCode算法题解(回溯、难点)|LeetCode51. N 皇后

LeetCode51. N 皇后 题目链接&#xff1a;51. N 皇后 题目描述&#xff1a; 按照国际象棋的规则&#xff0c;皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。 n 皇后问题 研究的是如何将 n 个皇后放置在 nn 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。…