SQL笔记7:近一个月发布的视频中热度最高的top3视频


前言

题目来源于牛客网sql企业题库第6题(困难):
近一个月发布的视频中热度最高的top3视频
在这里插入图片描述

问题:
在这里插入图片描述

代码如下:

1)需要筛选数据,按照近一个月内:

//作为where条件
datediff(date((select max(end_time)from tb_user_video_log)), date(t2.release_time))<=29

2)以video_id为group by条件,计算点赞数、转发数、评论数、视频完播率

//点赞数
sum(if_like) likes
//转发数
sum(if_retweet) retweets
//评论数
count(comment_id) comments
//视频完播率
avg(case when timestampdiff(second, start_time, end_time)>=duration then 1 else 0 end) play_rate
//最近无播放天数
datediff((select max(end_time) from tb_user_video_log), max(t1.end_time)) day_new

注意两个用法:
timestampdiff(second,start_time,end_time):返回两个datetime类型数据之间相差的秒数
datediff(a,b):a,b为sql语句时需要加括号

总代码如下:

//代码来源牛客题解区大佬,自己写的又臭又长
select
    a.video_id,
    round((100*play_rate + 5*likes + 3*comments + 2*retweets)*(1/(day_new+1)),0) hot_index
from
    (select
         t1.video_id, 
         avg(case when timestampdiff(second, start_time, end_time)>=duration then 1 else 0 end) play_rate,
         sum(if_like) likes,
         count(comment_id) comments,
         sum(if_retweet) retweets,
         datediff((select max(end_time) from tb_user_video_log), max(t1.end_time)) day_new 
     from
         tb_user_video_log t1
     join
         tb_video_info t2
     on
         t1.video_id=t2.video_id
     where
         datediff(date((select max(end_time)from tb_user_video_log)), date(t2.release_time))<=29
     group by
         t1.video_id
    ) a
ORDER BY
    hot_index DESC
LIMIT
    3

easy ~~

### **Spark SQL 零售商店数据分析项目** **项目名称**:零售商店销售数据分析 ​**技术栈**​:Spark 3.x + Python/Scala ​**考核目标**​:掌握 DataFrame 创建、查询、聚合、多表关联等核心操作 ------ ## **一、数据集说明** ### **1. 员工表 `employee.csv`** ```csv emp_id,name,age,gender,department,salary,hire_date E001,张伟,35,M,销售部,8500,2020-05-12 E002,李娜,28,F,财务部,9200,2021-02-18 E003,王强,42,M,物流部,7800,2019-08-03 E004,赵敏,31,F,销售部,8800,2021-07-22 E005,刘洋,26,M,IT部,10500,2022-01-15 E006,陈雪,29,F,销售部,8600,2020-11-30 E007,杨光,33,M,财务部,9500,2018-09-10 E008,周婷,27,F,物流部,8000,2022-03-25 ``` ### **2. 销售表 `sales.csv`** ```csv sale_id,emp_id,product_id,quantity,unit_price,sale_date S001,E001,P1001,2,299.50,2023-05-10 S002,E004,P1002,1,1599.00,2023-06-15 S003,E001,P1003,3,89.90,2023-04-18 S004,E006,P1001,1,299.50,2023-07-02 S005,E003,P1004,2,450.00,2023-05-28 S006,E004,P1002,1,1599.00,2023-06-20 S007,E002,P1005,4,120.00,2023-03-12 S008,E005,P1003,2,89.90,2023-08-05 ``` ### **3. 商品表 `product.csv`** ```csv product_id,product_name,category,supplier P1001,无线耳机,电子产品,SupplierA P1002,智能手机,电子产品,SupplierB P1003,保温杯,日用品,SupplierC P1004,运动鞋,服装,SupplierD P1005,笔记本,文具,SupplierA ``` ------ ## **二、考核任务** ### **任务1:DataFrame 创建与基础操作(30分)** 1. 加载所有CSV文件为DataFrame,并打印Schema(10分) 2. 统计各部门员工数量(10分) 3. 查询薪资超过9000的员工(10分) **示例代码**: ```python employee_df = spark.read.csv("employee.csv", header=True, inferSchema=True) employee_df.filter("salary > 9000").show() ``` ### **任务2:数据清洗与转换(20分)** 1. 处理销售表中的空值(`quantity`缺失时填充1)(10分) 2. 计算每笔销售的总金额(`quantity * unit_price`)(10分) **示例代码**: ```python from pyspark.sql.functions import col sales_df = sales_df.na.fill({"quantity": 1}) sales_df.withColumn("total_amount", col("quantity") * col("unit_price")).show() ``` ### **任务3:多表关联与聚合(40分)** 1. 查询每笔销售的详细信息(含员工名和商品名)(15分) 2. 统计各商品类别的销售总额(15分) 3. 找出销售额最高的员工(显示姓名和总销售额)(10分) **示例代码**: ```python joined_df = sales_df.join(employee_df, "emp_id").join(product_df, "product_id") joined_df.select("name", "product_name", "total_amount").show() ``` ------ ## **三、提交要求** 1. **代码文件**:完整的PySpark/Scala脚本 2. **运行截图**:关键查询结果的终端输出 3. 分析报告 (可选): - 数据质量问题和处理方式 - 关键业务发现(如最佳销售部门、热门商品) ------ ## **四、评分标准** | **任务** | **评分点** | **分值** | | :------------: | :----------------------: | :------: | | DataFrame创建 | 正确加载数据并打印Schema | 30 | | 数据清洗 | 空值处理、计算列添加 | 20 | | 多表关联与聚合 | JOIN操作、聚合函数使用 | 40 | | 数据可视化 | 图表正确性 | 10 | **建议时间**:120分钟 ​**难度**​:⭐️⭐️⭐️(中等) ------ ## **五、扩展挑战(可选)** 1. 计算员工销售额的月度增长率 2. 使用窗口函数找出各部门薪资最高的员工 **示例代码**: python 复制 ```python from pyspark.sql.window import Window windowSpec = Window.partitionBy("department").orderBy(col("salary").desc()) employee_df.withColumn("rank", rank().over(windowSpec)).show() ``` ------ ### **项目特点** 1. **业务贴性**:零售行业真实场景(员工、销售、商品) 2. **技能全覆盖**:从数据加载到复杂聚合+可视化 3. **可扩展性**:可通过增加数据量或添加时间分析提升难度
最新发布
06-17
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值