此题共包含两张表:

表1:用户-视频互动表tb_user_video_log

表2:短视频信息表tb_video_info

要解决的问题:

统计在有用户互动的最近一个月(按包含当天在内的近30天算,比如10月31日的近30天为10.2~10.31之间的数据)中,每类视频的转发量和转发率(保留3位小数)。

注:转发率=转发量÷播放量。结果按转发率降序排序。

解题思路:

  1. 计算播放量和转播量
  2. 根据1计算转发率,转发量/播放量,保留3位
  3. 筛选条件:就是有播放量的视频的最大日期 减去 30天(计算时不用区分tag)
  4. 按转发率降序排序

知识点:

  1. datediff(date1,date2) , 返回起始时间 date1 和结束时间 date2 之间的天数
  2. date_sub(date,INTERVAL expr type), 函数从日期减去指定的时间间隔。
  3. 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