题解 | 被重复观看次数最多的3个视频
被重复观看次数最多的3个视频
https://www.nowcoder.com/practice/b75fa2412659422c96369976ee1f9504
with view_count as(
select cid,uid,
count(*) as per_view
from play_record_tb
group by cid,uid
),
filter_view_count as(
select cid,
sum(per_view) pv
from view_count
where per_view > 1
group by cid
),
ranked_list as(
select cid,pv,row_number()over(order by pv desc, release_date desc) rk
from filter_view_count join course_info_tb using(cid)
)
select *
from ranked_list
where rk <= 3
order by rk
- 窗口函数不会减少行数:窗口函数(COUNT(*) OVER (PARTITION BY cid, uid))会为每一行计算一个值,但不会减少数据行数。例如,如果用户 1001 观看了课程 9001 两次,窗口函数会为这两行分别计算 2,而不是将这两行合并为一行。
- 后续步骤无法正确统计:在 filter_view_count 中对 per_view 求和,但由于窗口函数没有减少行数,会导致重复计算。例如,用户 1001 观看了课程 9001 两次,窗口函数会为这两行分别计算 2,然后在 filter_view_count 中求和时,会得到 4,而不是正确的 2。
海康威视公司福利 1211人发布