select tv.tag,
    count(case when tu.if_retweet =1 then 1 else null end) retweet_cnt,
    round(count(case when tu.if_retweet =1 then 1 else null end)/count(*),3) retweet_rate 
    from tb_user_video_log tu
    join tb_video_info  tv
    on tu.video_id = tv.video_id
    
    where date(tu.start_time) > (select date_sub(max(date(start_time)),interval 30 day) from tb_user_video_log)
    group by tv.tag
    order by retweet_rate desc

  1. 最近的时间是用start_time取得 而不是end_time,这里没懂
  2. 本来想写个cte取出来30天的初始位置和末尾位置,后来看其他人的答案 可以只取出来初始位置,然后条件大于这个值就可以