CTE比子查询逻辑更清晰 | #每类试卷得分前3名#

每类试卷得分前3名

https://www.nowcoder.com/practice/255aa1863fe14aa88694c09ebbc1dbca

因为窗口函数和聚合函数不能在同一个子查询里叠加使用,并且窗口函数的排序结果不能在同一个子查询底部进行where过滤,所以递进的CTE表达式是最方便的:

WITH info AS (
	SELECT
    	tid,
	    uid,
    	MAX(score) as maxs,
    	MIN(score) as mins
	FROM (
		SELECT
		    DISTINCT tag as tid,
		    r.id,
		    r.uid,
		    r.score
		FROM
		    examination_info
		JOIN
		    exam_record r USING(exam_id)
	) temp
	GROUP BY
	    tid, uid	
	ORDER BY
   		tid, maxs DESC, mins DESC, uid DESC
),

rn AS(
	SELECT
		 tid,
		uid,
		ROW_NUMBER() OVER (PARTITION BY tid ORDER BY tid, maxs DESC, mins DESC, uid DESC) AS ranking
	FROM 
		info
)

SELECT
	*
FROM
	rn
WHERE 
	ranking <= 3
    

row_number里的order by的逻辑直接复制第一段cte里的就行

全部评论

相关推荐

深夜书店vv:腾讯是这样的,去年很多走廊都加桌子当工区
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务