此题共包含两张表:
表1:用户-视频互动表tb_user_video_log
表2:短视频信息表tb_video_info
要解决的问题:
统计在有用户互动的最近一个月(按包含当天在内的近30天算,比如10月31日的近30天为10.2~10.31之间的数据)中,每类视频的转发量和转发率(保留3位小数)。
注:转发率=转发量÷播放量。结果按转发率降序排序。
解题思路:
- 计算播放量和转播量
- 根据1计算转发率,转发量/播放量,保留3位
- 筛选条件:就是有播放量的视频的最大日期 减去 30天(计算时不用区分tag)
- 按转发率降序排序
知识点:
- datediff(date1,date2) , 返回起始时间 date1 和结束时间 date2 之间的天数
- date_sub(date,INTERVAL expr type), 函数从日期减去指定的时间间隔。
- dateadd(date,INTERVAL expr type), 函数从日期增加指定的时间间隔。
Invalid use of group function
出现该错误提示的主要原因是聚合函数不可用,这里要特别区分where和having:
-
where 子句的作用是在分组前过滤数据,where条件中不能包含聚组函数。where通常与运算符一起出现(=、<、>、<>、>=、<=、like、between等)
-
having 子句的作用是在分组之后过滤数据,条件中经常包含聚组函数 (sum、count、avg等)
where和having
-
标量子查询(一列一行)
-
列子查询(一列多行),搭配如下操作符使用
① in/not in 等于列表中的任意一个
② any/some 和子查询返回的某一个值比较
③ all 和子查询返回的所有值比较
-
行子查询(一行多列或多行多列),由于筛选条件的判断符号必须相同,较少使用。
SELECT tag,
SUM(if_retweet) retweet_cnt,
ROUND(SUM(if_retweet)/COUNT(*), 3) retweet_rate
FROM tb_user_video_log
LEFT JOIN tb_video_info using(video_id)
WHERE DATEDIFF(DATE((select max(start_time) FROM tb_user_video_log)), DATE(start_time)) <= 29
/* WHERE DATE(start_time) > (
SELECT max(DATE(start_time)),
DATE_SUB(MAX(DATE(start_time)), INTERVAL 30 DAY)
FROM tb_user_video_log
*/
GROUP BY tag
ORDER BY retweet_rate desc