题解 | #窗口函数 重点:查询每天刷题最多的前二用户#
查询每天刷题通过数最多的前二名用户id和刷题数
https://www.nowcoder.com/practice/b9cc0d5047f94bc0a661c5a0a230b9cd
#错误示范
# select
# `user_id`,
# `date`,
# sum(`pass_count`) over as pass_count
# from
# `questions_pass_record`
# group by
# `user_id`
# order by
# `pass_count`
# limit
# 2
#分组(一对一可以用正常group(一组对应一条数据),一对多就用(一组对应多条数据))
#没有考虑到一个人一天可以刷多门课---不过思路是正确的
# select
# date,
# user_id,
# pass_count
# from
# (
# select
# date,
# user_id,
# pass_count,
# row_number() over (
# partition by
# date
# order by
# pass_count desc
# ) as row_num
# from
# questions_pass_record
# ) as t
# where
# row_num <= 2;
# select
# date,
# user_id,
# pass_count
# from
# (
# select
# date,
# user_id,
# pass_count,
# row_number() over (
# partition by
# date
# order by
# pass_count desc
# ) as row_num
# from
# questions_pass_record
# ) as t
# where
# row_num <= 2;
#因为一个人要刷不同的题,所以要先通过聚合计算出总刷题数。因为要计算一个人的刷题数,所以要对user_id进行分组
# select user_id, date, sum(pass_count) as pass_count
# from questions_pass_record
# group by user_id, date
select
date,
user_id,
# b.row,
pass_count
from
(
select date,
user_id,
pass_count,
dense_rank() over(partition by `date` order by `pass_count` desc) as `row`
from
(select user_id, date, sum(pass_count) as pass_count
from questions_pass_record
group by user_id, date) as a
) as b
where b.row<=2
