SQL159 每个创作者每月的涨粉率及截止当前的总粉丝量

描述

用户-视频互动表tb_user_video_log

iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id
110120012021-09-01 10:00:002021-09-01 10:00:20011NULL
210520022021-09-10 11:00:002021-09-10 11:00:30101NULL
310120012021-10-01 10:00:002021-10-01 10:00:20111NULL
410220012021-10-01 10:00:002021-10-01 10:00:15001NULL
510320012021-10-01 11:00:502021-10-01 11:01:151101732526
610620022021-10-01 10:59:052021-10-01 11:00:05200NULL

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

短视频信息表tb_video_info

idvideo_idauthortagdurationrelease_time
12001901影视302021-01-01 07:00:00
22002901美食602021-01-01 07:00:00
32003902旅游902020-01-01 07:00:00
42004902美女902020-01-01 08:00:00

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

问题:计算2021年里每个创作者每月的涨粉率及截止当月的总粉丝量

  • 涨粉率=(加粉量 - 掉粉量) / 播放量。结果按创作者ID、总粉丝量升序排序。
  • if_follow-是否关注为1表示用户观看视频中关注了视频创作者,为0表示此次互动前后关注状态未发生变化,为2表示本次观看过程中取消了关注。

输出示例

示例数据的输出结果如下

authormonthfans_growth_ratetotal_fans
9012021-090.5001
9012021-100.2502

解释:

示例数据中表tb_user_video_log里只有视频2001和2002的播放记录,都来自创作者901,播放时间在2021年9月和10月;其中9月里加粉量为1,掉粉量为0,播放量为2,因此涨粉率为0.500(保留3位小数);其中10月里加粉量为2,掉份量为1,播放量为4,因此涨粉率为0.250,截止当前总粉丝数为2。

示例1

输入:

DROP TABLE IF EXISTS tb_user_video_log, tb_video_info;
CREATE TABLE tb_user_video_log (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    uid INT NOT NULL COMMENT '用户ID',
    video_id INT NOT NULL COMMENT '视频ID',
    start_time datetime COMMENT '开始观看时间',
    end_time datetime COMMENT '结束观看时间',
    if_follow TINYINT COMMENT '是否关注',
    if_like TINYINT COMMENT '是否点赞',
    if_retweet TINYINT COMMENT '是否转发',
    comment_id INT COMMENT '评论ID'
) CHARACTER SET utf8 COLLATE utf8_bin;

CREATE TABLE tb_video_info (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    video_id INT UNIQUE NOT NULL COMMENT '视频ID',
    author INT NOT NULL COMMENT '创作者ID',
    tag VARCHAR(16) NOT NULL COMMENT '类别标签',
    duration INT NOT NULL COMMENT '视频时长(秒数)',
    release_time datetime NOT NULL COMMENT '发布时间'
)CHARACTER SET utf8 COLLATE utf8_bin;

INSERT INTO tb_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id) VALUES
   (101, 2001, '2021-09-01 10:00:00', '2021-09-01 10:00:20', 0, 1, 1, null)
  ,(105, 2002, '2021-09-10 11:00:00', '2021-09-10 11:00:30', 1, 0, 1, null)
  ,(101, 2001, '2021-10-01 10:00:00', '2021-10-01 10:00:20', 1, 1, 1, null)
  ,(102, 2001, '2021-10-01 10:00:00', '2021-10-01 10:00:15', 0, 0, 1, null)
  ,(103, 2001, '2021-10-01 11:00:50', '2021-10-01 11:01:15', 1, 1, 0, 1732526)
  ,(106, 2002, '2021-10-01 10:59:05', '2021-10-01 11:00:05', 2, 0, 0, null);

INSERT INTO tb_video_info(video_id, author, tag, duration, release_time) VALUES
   (2001, 901, '影视', 30, '2021-01-01 7:00:00')
  ,(2002, 901, '影视', 60, '2021-01-01 7:00:00')
  ,(2003, 902, '旅游', 90, '2020-01-01 7:00:00')
  ,(2004, 902, '美女', 90, '2020-01-01 8:00:00');

输出:

901|2021-09|0.500|1
901|2021-10|0.250|2

解答

下面是解题过程的详细题解,以及对应的SQL代码和注释:

  1. 确定数据源:首先,我们需要知道数据存储在哪些表中,以及表中的列名。根据题目,我们有两个表:tb_user_video_logtb_video_info
  2. 筛选数据:我们需要筛选出2021年的数据。这可以通过比较end_time字段的年份部分来实现。
  3. 计算涨粉率:涨粉率是新增粉丝数与流失粉丝数的差额除以当月的总粉丝数。我们使用COUNT(distinct if(if_follow = 1,uid,null))来计算新增粉丝数,使用COUNT(distinct if(if_follow = 2,uid,null))来计算流失粉丝数。
  4. 计算总粉丝量:总粉丝量是每个月新增的粉丝数减去流失的粉丝数的累计和。我们使用SUM(IF(if_follow = 2, -1, if_follow))来计算每个月的净增粉丝数,并使用窗口函数OVER来计算累计和。
  5. 分组和排序:最后,我们需要按照创作者和月份分组,并按照创作者和总粉丝量排序。

SELECT 
    author, -- 选择创作者字段
    substr(end_time,1,7) AS month -- 将end_time字段截取到年和月,作为月份字段
    ,round((COUNT(distinct if(if_follow = 1,uid,null)) -- 计算新增粉丝数量
            -COUNT(distinct if(if_follow = 2,uid,null ))) / COUNT(distinct a.id),3) AS fans_growth_rate -- 计算涨粉率,取三位小数
    ,sum(SUM(IF(if_follow = 2, -1, if_follow))) over(PARTITION BY author order by substr(end_time,1,7)) as total_fans -- 使用窗口函数计算截止当月的总粉丝量
FROM 
    tb_user_video_log a -- 从用户视频日志表中选择数据
LEFT JOIN 
    tb_video_info b -- 与视频信息表进行左连接
ON 
    a.video_id = b.video_id -- 通过video_id关联两个表
where 
    substr(end_time,1,4) >='2021' -- 筛选出2021年的数据
GROUP BY 
    author, -- 按创作者分组
    substr(end_time,1,7) -- 按月份分组
order by 
    author asc , -- 按照创作者名称进行升序排序
    total_fans asc; -- 按照总粉丝量进行升序排序

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

-31-()

在终端运行时消除输入空格对程序的影响可以使用{在scanf后加“getchar()”或者在scanf(“空格%d”,&a)} 按位与和移位操作符只能用于整数且都要转位二进制后进行相应操作 不创建临时变量,实现两个数的交换:1——使用加减法&…

【全开源】多功能投票小程序系统源码(ThinkPHP+FastAdmin+Uniapp)

🚀 多功能投票小程序,让决策变得更简单! 基于ThinkPHPFastAdminUniapp开发的多功能系统,支持图文投票、自定义选手报名内容、自定义主题色、礼物功能(高级授权)、弹幕功能(高级授权)、会员发布、支持数据库私有化部署&#xff0c…

本周重磅日程:美联储决议、中美通胀、苹果AI和英伟达拆股

当周重磅看点颇多:美联储FOMC将公布最新利率“点阵图”,中国5月金融数据、中美通胀数据将出炉,日本央行购债计划是否变动成为市场焦点,苹果2024全球开发者大会一系列AI功能将亮相;特斯拉2024股东大会上马斯克560亿美元…

Springboot结合redis实现关注推送

关注推送 Feed流的模式 Timeline:不做内容筛选,简单的按照内容发布时间排序。常用于好友与关注。例如朋友圈的时间发布排序。 优点:信息全面,不会有缺失。并且实现也相对简单 缺点:信息噪音较多,用户不一定感兴趣,内容获取效率…

Spring Boot整合Redis实现发布/订阅功能

😄 19年之后由于某些原因断更了三年,23年重新扬帆起航,推出更多优质博文,希望大家多多支持~ 🌷 古之立大事者,不惟有超世之才,亦必有坚忍不拔之志 🎐 个人CSND主页——Mi…

来腾讯第4天,我已经焦虑昏了啊!

大家好,我是白露啊。 今天在看到一个实习生在抱怨,给我笑惨了。 标题是:“腾讯实习第4天,焦虑昏了”! 他写道:“怎么办啊牛爷爷们,什么都不会。业务看不懂,文档看不懂,…

用 Python 撸一个 Web 服务器-第4章:动态渲染数据

上一章中为了尽快让 Todo List 程序跑起来,并没有完全按照 MVC 模式编写程序。这一章就让我们一起实现一个完整的 MVC 模式 Todo List 程序首页。 使用模型操作数据 我们来分析下请求 Todo List 程序首页时,模型层需要做哪些事情。当一个请求到达首页视…

Office文档处理语言(VBA/PyWin32/Jacob)对比

概述: 首先给出的结论是:VBA > PyWin32 > Jacob,下面将给出详细的对比情况 详细对比数据: 1. VBA VBA,微软的亲儿子,和Office是契合度最高的,也是和Windows系统契合度最高的,…

【设计模式】结构型设计模式之 适配器模式

介绍 适配器模式(Adapter Pattern) 是一种结构型设计模式,它的核心目的是使接口不兼容的类能够协同工作。适配器模式通过将一个类的接口转换为客户希望的另一个接口,来解决两个已有接口之间不匹配的问题,从而增加它们…

【递归+二叉树思想+搜索】 Alice and the Cake题解

Alice and the Cake题解 AC记录:记录-洛谷 题面翻译(大概就是题目大意) 执行恰好 n − 1 n-1 n−1 次操作,每次操作可以选择当前所有蛋糕中满足其重量 w ⩾ 2 w\geqslant 2 w⩾2 的一块,然后将其分为质量分别为 …

powerdesigner各种字体设置

1、设置左侧菜单: 步骤如下: tools —> general options —> fonts —> defalut UI font ,选择字体样式及大小即可,同下图。 2、设置Table的字体大小 Tools------>Display Prefrences------>Table------->Format---------…

【EDA】SSTA中最慢路径与最快路径统计计算

假设(X1,X2)为二元高斯随机向量,均值(μ1,μ2),标准差(σ1,σ2),相关系数ρ 定义:X=max(X1,X2),Y=min(X1,X2) SSTA中计算setup/hold的worst delay时即求X、Y,路径N对应维度为N维。 X的概率密度函数PDF为f(x)=f1(-x)+f2(-x),f1和f2为: 其中小Φ和大Φ…

Android 蓝牙profile的配置

在做BQB认证之前,我们需要确认那些profile之前,我们需要查看profile的配置情况 Android13版本前蓝牙profile的配置 MTK的项目代码如下 vendor\mediatek\proprietary\packages\modules\Bluetooth\android\app\res\values\config.xml 高通的项目代码如…

【CS.OS】堆管理算法:不同的堆分配和管理算法

1000.5.CS.OS.1.3-基础-内存管理-堆管理算法-Created: 2024-06-09.Sunday10:41 文章目录 1 内存分配算法概述1.1 首次适应(First-Fit)1.2 最佳适应(Best-Fit) 2 伙伴系统(Buddy System) 3 总结References …

Django ListView 列表视图类

ListView是Django的通用视图之一,它用于显示一个对象列表。这个视图将所有的对象作为一个上下文变量传递给模板。 1,创建应用 python manage.py startapp app3 2,注册应用 Test/Test/settings.py Test/Test/urls.py 3,添加模型 …

IDEA去除代码和XML中的波浪线(黄色警告线)

通常情况下,IDE自带的侦测功能会帮我们提示一些错误、警告等。但这对于强迫症患者来说并不友好。以下是去除IDE代码和XML文件中的波浪线(黄色警告线)、拯救强迫症患者的有效方案 1、去除XML中的波浪线 2、去除代码中的波浪线 关爱强迫症患者…

Go模板页面浏览器显示HTML源码问题

<!--* Title: This is a file for ……* Author: JackieZheng* Date: 2024-06-09 17:00:01* LastEditTime: 2024-06-09 17:01:12* LastEditors: Please set LastEditors* Description:* FilePath: \\GoCode\\templates\\index.html --> <!DOCTYPE html> <html …

第一次视频学习

1、了解AI答题应用 1.1 业务流程架构图 1.2 自定义上传题目流程 1.3 时序图 这个比较困难&#xff0c;第一次了解到流式&#xff0c;便于前端与用户交互

2024年IntelliJ系列最新专业版安装码教程!(持续更新)

本教程适用于 J B 全系列产品&#xff0c;包括 Pycharm、IDEA、WebStorm、Phpstorm、Datagrip、RubyMine、CLion、AppCode 等。 2018-2024 均适用&#xff01; &#xff08;直接复制&#xff0c;拿走不谢&#xff09; 9H1390TRAK-eyJsaWNlbnNlSWQiOiI5SDEzOTBUUkFLIiwibGljZW…

Kubernetes入门-大简介

目录 何为微服务 何为云原生 何为编排器 “Kubernetes”这个名字来自希腊语&#xff0c;意思是“舵手”舵手是一个航海/航行术语&#xff0c;指掌舵的人从本质上说&#xff0c;Kubernetes是云原生微服务(cloud-native microservice)应用的编排器(orchestrator) 何为微服务 …