with popular_amount as(
select
c.cid as cid,
count(uid) as pv,
sum(timestampdiff(minute, start_time, end_time)) as time_len
from
course_info_tb c
join play_record_tb p on c.cid = p.cid
where
timestampdiff(day, release_date, date(end_time)) < 7
group by
cid
having
avg(score) >= 3
),
popular_rank as (
select
cid,
pv,
time_len,
row_number() over(order by pv desc, time_len desc) as rk
from
popular_amount
)
select
cid,
pv,
time_len
from popular_rank
where rk <= 3
- 按cid分组,筛选出是平均评分不低于3(>=3),发布后一周内被观看的视频,随后计算被观看次数与被观看时长
- 按被观看次数与被观看时长排序,使用窗口函数得到排名
- 筛选出排名<=3,即为TOP3