with
details as (
select
t.cid,
pv,
time_len,
row_number() over ( /*窗口函数只能出现在子查询,分布查询或者order by 里*/
/*这里千万不能按照课程id分组,因为目标是符合条件的每个课程输出为一行,加上partition by 就是在相同的cid中排序,这就错了*/
order by
pv desc,
time_len desc
) as rk
from
(
select
p.cid,
count(*) as pv,
round(
sum(timestampdiff(minute, start_time, end_time)),
3
) as time_len
from
play_record_tb p
join course_info_tb c on p.cid = c.cid
where /*SQL不支持连续比较符,需要用and连接(有时可以用between---and---)*/
release_date <= date(start_time)
and date(start_time) < release_date + interval "7" day
/*也可以用dateadd(release_date,interval "7" day),注意是day不是days*/
and start_time < end_time
group by
p.cid
having avg(score) >= 3
/*avg()也是聚合函数,不能用在where里*/
) t
)
select details.cid
,pv
,time_len
from details
where rk <= 3
order by rk