SELECT author,month,ROUND(fans_growth_cnt/play_cnt,3) AS fans_growth_rate,SUM(fans_growth_cnt) OVER (PARTITION BY author ORDER BY month) as total_fans
FROM (SELECT author,DATE_FORMAT(start_time,"%Y-%m") as month,SUM(IF(if_follow=2,-1,if_follow)) AS fans_growth_cnt,COUNT(1) AS play_cnt
FROM tb_user_video_log JOIN tb_video_info USING(video_id)
WHERE YEAR(start_time)=2021
GROUP BY author,month) as t
ORDER BY author,total_fans;

1.子查询和主查询

限制性内层子查询再执行主查询,FROM中的子查询各列名称不一定与主查询各列名称完全一样,但个数和内在逻辑必须对应一致。

并且不要忘记给子查询编辑别名

聚合函数COUNT在分组后是只计算某一组的个数,因此不用再限定COUNT计数的对象

2.DATE_FORMAT(start_time,"%Y-%m") 函数

DATE_FORMAT(start_time, "%Y-%m") 是 MySQL 中用于将日期或时间戳格式化为指定字符串的函数。以下是详细解释:

(1)函数作用 将日期 / 时间戳转换为自定义格式的字符串。 常用于报表生成、数据展示或需要特定日期格式的场景。

(2)语法结构 DATE_FORMAT(date, format)

date:要格式化的日期或时间戳字段(如 start_time)。

format:目标字符串格式,使用特定的格式符号(如 %Y、%m)。

3. 关键格式符号符号

含义 示例

%Y 4 位年份 2023

%y 2 位年份 23

%m 2 位数字月份(01-12) 01 至 12

%c 数字月份(1-12) 1 至 12

%M 月份名称(如 January) January

%b 月份缩写(如 Jan) Jan

%d 2 位日期(01-31) 01 至 31

%H 24 小时制小时(00-23) 00 至 23

%h 12 小时制小时(01-12) 01 至 12

%i 分钟(00-59) 00 至 59

%s 秒(00-59) 00 至 59

4.作答思路

首先创建子查询,将需要的基本量计算出来,并设定好各种条件,在主查询中使用。