SQL学习,大厂面试真题(1):观看各个视频的平均完播率

各个视频的平均完播率

1、视频信息表

ID AuthorName Category Age Start Time
1 张三 影视 30 2024-01-01 7:00:00
2 李四 美食 60 2024-01-01 7:00:00
3 王麻子 旅游 90 2024-01-01 7:00:00
(video_id-视频ID,  AuthorName-创作者, tag-类别标签, duration-视频时长(秒), release_time-发布时间)

2、视频互动表

ID Group Start Time End Time Status Flag1 Flag2 Value
1 1 2024-06-01 10:00:00 2024-06-01 10:00:30 0 1 1 null
2 1 2024-06-01 10:00:00 2024-06-01 10:00:24 0 0 1 null
3 1 2024-06-01 11:00:00 2024-06-01 11:00:34 0 1 0 1
1 2 2024-09-01 10:00:00 2024-09-01 10:00:42 1 0 1 null
2 2 2024-06-01 11:00:00 2024-06-01 11:00:30 1 0 1 null
3 1 2024-06-01 12:00:00 2024-06-01 11:00:34 0 1 0 1
(uid-用户ID, video_id-视频ID, start_time-开始观看时间, end_time-结束观看时间, if_follow-是否关注, if_like-是否点赞, if_retweet-是否转发, comment_id-评论ID)

问题:计算2024年里有播放记录的每个视频的完播率(结果保留三位小数),并按完播率降序排序
注:视频完播率是指完成播放次数占总播放次数的比例。简单起见,结束观看时间与开始播放时间的差>=视频时长时,视为完成播放。

SQL实现过程:

1、创建表和插入数据

CREATE TABLE dy_video_info (
    id INT PRIMARY KEY AUTO_INCREMENT COMMENT '自增ID',
    video_id INT UNIQUE NOT NULL COMMENT '视频ID',
    authorname VARCHAR(16) 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 utf8mb3_general_ci;


INSERT INTO dy_video_info(video_id, authorname, tag, duration, release_time) VALUES
  (1, '张三', '影视', 31, '2024-01-01 7:00:00'),
  (2, '李四', '美食', 65, '2024-01-01 7:00:00'),
  (3, '王麻子', '搞笑', 90, '2024-01-01 7:00:00');
  

CREATE TABLE dy_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 utf8mb3_general_ci;

INSERT INTO dy_user_video_log(uid, video_id, start_time, end_time, if_follow, if_like, if_retweet, comment_id) VALUES
  (1, 1, '2024-06-01 10:00:00', '2024-06-01 10:00:30', 0, 1, 1, null),
  (2, 1, '2024-06-01 10:00:00', '2024-06-01 10:00:24', 0, 0, 1, null),
  (3, 3, '2024-06-01 11:00:00', '2024-06-01 11:00:34', 0, 1, 0, 1),
  (1, 2, '2024-09-01 10:00:00', '2024-09-01 10:00:42', 1, 0, 1, null),
  (2, 2, '2024-06-01 11:00:00', '2024-06-01 11:00:30', 1, 0, 1, null),
  (3, 3, '2024-06-01 11:00:00', '2024-06-01 11:00:34', 0, 1, 0, 1);


a、先分析:
在这里插入图片描述
b、计算结束时间和开始时间的差值:


SELECT video_id ,
	  end_time - start_time as avg_comp_play_rate
FROM dy_user_video_log ORDER BY  video_id

在这里插入图片描述
c、加入结束时间减开始时间大于30的记为1,其他的记为0

SELECT 
    video_id,
	avg_comp_play_rate,
    IF(avg_comp_play_rate > 30, 1, 0) AS play_rate_result
FROM 
(
    SELECT 
        video_id,
		
        (end_time - start_time) as avg_comp_play_rate
    FROM 
        dy_user_video_log
) AS derived_table_name;

在这里插入图片描述

2、SQL实现效果

-- 选择视频ID和计算平均完成播放率
SELECT 
    a.video_id, -- 选择视频的ID
    -- 计算平均完成播放率,四舍五入到小数点后三位
    round(
        -- 使用条件求和和计数函数计算完成播放率
        sum(
            if(
                -- 如果视频的结束时间减去开始时间大于等于视频的时长,则认为是完成播放
                end_time - start_time >= duration, 
                1, -- 完成播放记为1
                0  -- 否则记为0
            )
        ) / -- 将完成播放的个数除以总播放次数
        count(start_time), -- 计算总播放次数
        3 -- 四舍五入到小数点后三位
    ) as avg_comp_play_rate -- 将计算结果命名为avg_comp_play_rate
FROM 
    dy_user_video_log a -- 从dy_user_video_log表中选择数据,别名为a
-- 左连接dy_video_info表,别名为b,根据视频ID匹配
LEFT JOIN dy_video_info b
    on a.video_id = b.video_id
WHERE 
    year(start_time) = 2024 -- 筛选出开始时间年份为2024的记录
GROUP BY 
    a.video_id -- 根据视频ID分组
ORDER BY 
    avg_comp_play_rate DESC; -- 按平均完成播放率降序排列

在这里插入图片描述

最近更新

  1. TCP协议是安全的吗?

    2024-06-12 08:56:02       16 阅读
  2. 阿里云服务器执行yum,一直下载docker-ce-stable失败

    2024-06-12 08:56:02       16 阅读
  3. 【Python教程】压缩PDF文件大小

    2024-06-12 08:56:02       15 阅读
  4. 通过文章id递归查询所有评论(xml)

    2024-06-12 08:56:02       18 阅读

热门阅读

  1. 设计模式之外观模式

    2024-06-12 08:56:02       10 阅读
  2. pyautogui 等待元素出现的方法

    2024-06-12 08:56:02       10 阅读
  3. app-ios 内嵌h5的缓存问题

    2024-06-12 08:56:02       5 阅读
  4. 简单聊聊Vue

    2024-06-12 08:56:02       10 阅读
  5. 微信小程序·审核

    2024-06-12 08:56:02       9 阅读
  6. Hive的存储格式和压缩算法的特点和选择

    2024-06-12 08:56:02       8 阅读
  7. React和Vue有什么区别

    2024-06-12 08:56:02       8 阅读
  8. ubuntu22.04禁止自动休眠的几种方式

    2024-06-12 08:56:02       9 阅读
  9. 算法训练营day53

    2024-06-12 08:56:02       7 阅读
  10. 代码随想录算法训练营day44

    2024-06-12 08:56:02       8 阅读