IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 开发工具 -> 国庆期间每类视频点赞量和转发量 -> 正文阅读

[开发工具]国庆期间每类视频点赞量和转发量

国庆期间每类视频点赞量和转发量

题目链接

描述

用户-视频互动表tb_user_video_log

iduidvideo_idstart_timeend_timeif_followif_likeif_retweetcomment_id
110120012021-09-24 10:00:002021-09-24 10:00:20110NULL
210520022021-09-25 11:00:002021-09-25 11:00:30001NULL
310220022021-09-25 11:00:002021-09-25 11:00:30111NULL
410120022021-09-26 11:00:002021-09-26 11:00:30101NULL
510120022021-09-27 11:00:002021-09-27 11:00:30110NULL
610220022021-09-28 11:00:002021-09-28 11:00:30101NULL
710320022021-09-29 11:00:002021-10-02 11:00:30101NULL
810220022021-09-30 11:00:002021-09-30 11:00:30111NULL
910120012021-10-01 10:00:002021-10-01 10:00:20110NULL
1010220012021-10-01 10:00:002021-10-01 10:00:15001NULL
1110320012021-10-01 11:00:502021-10-01 11:01:151101732526
1210620022021-10-02 10:59:052021-10-02 11:00:05201NULL
1310720022021-10-02 10:59:052021-10-02 11:00:05101NULL
1410820022021-10-02 10:59:052021-10-02 11:00:05111NULL
1510920022021-10-03 10:59:052021-10-03 11:00:05010NULL

(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旅游302020-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年国庆头3天每类视频每天的近一周总点赞量和一周内最大单天转发量,结果按视频类别降序、日期升序排序。假设数据库中数据足够多,至少每个类别下国庆头3天及之前一周的每天都有播放记录。

输出示例

示例数据的输出结果如下

tagdtsum_like_cnt_7dmax_retweet_cnt_7d
旅游2021-10-0152
旅游2021-10-0253
旅游2021-10-0363

解释:

由表tb_user_video_log里的数据可得只有旅游类视频的播放,2021年9月25到10月3日每天的点赞量和转发量如下:

tagdtlike_cntretweet_cnt
旅游2021-09-2512
旅游2021-09-2601
旅游2021-09-2710
旅游2021-09-2801
旅游2021-09-2901
旅游2021-09-3011
旅游2021-10-0121
旅游2021-10-0213
旅游2021-10-0310

因此国庆头3天(10.0110.03)里10.01的近7天(9.2510.01)总点赞量为5次,单天最大转发量为2次(9月25那天最大);同理可得10.02和10.03的两个指标。

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-24 10:00:00', '2021-09-24 10:00:20', 1, 1, 0, null)
  ,(105, 2002, '2021-09-25 11:00:00', '2021-09-25 11:00:30', 0, 0, 1, null)
  ,(102, 2002, '2021-09-25 11:00:00', '2021-09-25 11:00:30', 1, 1, 1, null)
  ,(101, 2002, '2021-09-26 11:00:00', '2021-09-26 11:00:30', 1, 0, 1, null)
  ,(101, 2002, '2021-09-27 11:00:00', '2021-09-27 11:00:30', 1, 1, 0, null)
  ,(102, 2002, '2021-09-28 11:00:00', '2021-09-28 11:00:30', 1, 0, 1, null)
  ,(103, 2002, '2021-09-29 11:00:00', '2021-09-29 11:00:30', 1, 0, 1, null)
  ,(102, 2002, '2021-09-30 11:00:00', '2021-09-30 11:00:30', 1, 1, 1, null)
  ,(101, 2001, '2021-10-01 10:00:00', '2021-10-01 10:00:20', 1, 1, 0, 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-02 10:59:05', '2021-10-02 11:00:05', 2, 0, 1, null)
  ,(107, 2002, '2021-10-02 10:59:05', '2021-10-02 11:00:05', 1, 0, 1, null)
  ,(108, 2002, '2021-10-02 10:59:05', '2021-10-02 11:00:05', 1, 1, 1, null)
  ,(109, 2002, '2021-10-03 10:59:05', '2021-10-03 11:00:05', 0, 1, 0, null);

INSERT INTO tb_video_info(video_id, author, tag, duration, release_time) VALUES
   (2001, 901, '旅游', 30, '2020-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');

2.查询

SELECT * FROM tb_user_video_log; 
SELECT * FROM tb_video_info;


3.问题

统计2021年国庆头3天每类视频每天的近一周总点赞量和一周内最大单天转发量
结果按视频类别降序、日期升序排序。假设数据库中数据足够多,至少每个类别下国庆头3天及之前一周的每天都有播放记录。


难点:

  • 近一周SQL怎么实现?
  • 最大单天转发量怎么求?if_retweet = 1的多条记录求和

解析:

  1. 求每类视频每天的点赞量和每天的转发量,时间是2021-9-25 到 2021-10-3
  2. 使用窗口函数求 每个dt日期之前6天(题目中所要求的一周内)的 日点赞量 的和
  3. 以及单天转发量的最大值

4. 求解

  1. 先求解求每类视频每天的点赞量和每天的转发量,时间是2021-9-25 到 2021-10-3:
	SELECT
			y.tag,
			DATE(x.start_time) 	  dt,
			SUM(x.if_like) 	  AS  daily_like_cnt,
			SUM(x.if_retweet) AS  daily_retweet_cnt
		FROM
			tb_user_video_log x,
			tb_video_info y
		WHERE
			x.video_id = y.video_id
		AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
		GROUP BY tag, dt
		ORDER BY tag, dt

  1. 求每个日期每个日期近一周的点赞量和单天转发量
WITH t AS (
			SELECT
				y.tag,
				DATE(x.start_time) 	  dt,
				SUM(x.if_like) 	  AS  daily_like_cnt,
				SUM(x.if_retweet) AS  daily_retweet_cnt
			FROM
				tb_user_video_log x,
				tb_video_info y
			WHERE
				x.video_id = y.video_id
			AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
			GROUP BY tag, dt
			ORDER BY tag, dt
		) SELECT
			tag,
			dt,
			daily_like_cnt,
			daily_retweet_cnt,
			SUM(daily_like_cnt) over(partition by tag ORDER BY dt rows between 6 preceding AND current row) AS sum_like_cnt_7d,
			max(daily_retweet_cnt) over(partition by tag order by dt rows between 6 preceding and current row) AS max_retweet_cnt_7d
		FROM
			t

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tg9Lbpiq-1647783437315)(https://s2.loli.net/2022/03/20/FZRzngeIpyYkOhQ.png)]

注意:

SUM(daily_like_cnt) over(partition by tag ORDER BY dt rows between 6 preceding AND current row)
-- 根据tag分组,dt升序排列,按照行求出当前日期对应的daily_like_cnt之前6行的值到当前行的值的和,结果刚好是一周内的总点赞量。

注:窗口函数的使用

  1. 方法一
聚集函数/非聚集函数 OVER window_name
WINDOW window_name AS (window_spec)
	

按照第一种方法上面的代码为:

WITH t AS (
				SELECT
					y.tag,
					DATE(x.start_time) 	  dt,
					SUM(x.if_like) 	  AS  daily_like_cnt,
					SUM(x.if_retweet) AS  daily_retweet_cnt
				FROM
					tb_user_video_log x,
					tb_video_info y
				WHERE
					x.video_id = y.video_id
				AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
				GROUP BY tag, dt
				ORDER BY tag, dt
			) SELECT
				tag,
				dt,
				daily_like_cnt,
				daily_retweet_cnt,
				SUM(daily_like_cnt) over(partition by tag ORDER BY dt rows between 6 preceding AND current row) AS sum_like_cnt_7d,
				max(daily_retweet_cnt) over(partition by tag order by dt rows between 6 preceding and current row) AS max_retweet_cnt_7d
			FROM
				t
  1. 方法二
聚集函数/非聚集函数 OVER(window_spec)
window_spec : [window_name] [partition_clause] [order_clause] [frame_clause]

按照第二种方法上面的代码改写为:

WITH t AS (
				SELECT
					y.tag,
					DATE(x.start_time) 	  dt,
					SUM(x.if_like) 	  AS  daily_like_cnt,
					SUM(x.if_retweet) AS  daily_retweet_cnt
				FROM
					tb_user_video_log x,
					tb_video_info y
				WHERE
					x.video_id = y.video_id
				AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
				GROUP BY tag, dt
				ORDER BY tag, dt
			) SELECT
				tag,
				dt,
				daily_like_cnt,
				daily_retweet_cnt,
				SUM(daily_like_cnt) over w AS sum_like_cnt_7d,
				max(daily_retweet_cnt) over w AS max_retweet_cnt_7d
			FROM t
			WINDOW w  AS (partition by tag ORDER BY dt rows between 6 preceding AND current row);

我们对着两种方式进行对比发现:

over(windos_spec), 在 select 后使用多个窗口函数时, windos_spec 过多,我们使用第二种方法相当于把windos_spec重复的代码只写了 一次,进而减少重复。

  1. 以上我们已经得到了所有日期的近一周的点赞量和转发量,下面只需要 多一条where语句求出指定日期的即可:
SELECT tag, dt, sum_like_cnt_7d, max_retweet_cnt_7d 
FROM (
		上面的with代码
	 ) tt
WHERE dt BETWEEN '2021-10-01' AND '2021-10-03'
order by tag desc, dt asc

全部代码如下:

SELECT tag, dt, sum_like_cnt_7d, max_retweet_cnt_7d 
FROM (
			WITH t AS (
				SELECT
					y.tag,
					DATE(x.start_time) 	  dt,
					SUM(x.if_like) 	  AS  daily_like_cnt,
					SUM(x.if_retweet) AS  daily_retweet_cnt
				FROM
					tb_user_video_log x,
					tb_video_info y
				WHERE
					x.video_id = y.video_id
				AND DATE(start_time) BETWEEN "2021-9-25" AND "2021-10-3"
				GROUP BY tag, dt
				ORDER BY tag, dt
			) SELECT
				tag,
				dt,
				daily_like_cnt,
				daily_retweet_cnt,
				SUM(daily_like_cnt) over(partition by tag ORDER BY dt rows between 6 preceding AND current row) AS sum_like_cnt_7d,
				max(daily_retweet_cnt) over(partition by tag order by dt rows between 6 preceding and current row) AS max_retweet_cnt_7d
			FROM
				t) tt
WHERE dt BETWEEN '2021-10-01' AND '2021-10-03'
order by tag desc, dt asc

结果图:

  开发工具 最新文章
Postman接口测试之Mock快速入门
ASCII码空格替换查表_最全ASCII码对照表0-2
如何使用 ssh 建立 socks 代理
Typora配合PicGo阿里云图床配置
SoapUI、Jmeter、Postman三种接口测试工具的
github用相对路径显示图片_GitHub 中 readm
Windows编译g2o及其g2o viewer
解决jupyter notebook无法连接/ jupyter连接
Git恢复到之前版本
VScode常用快捷键
上一篇文章      下一篇文章      查看所有文章
加:2022-03-22 20:48:22  更:2022-03-22 20:48:37 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/26 4:25:50-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码