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里的就行

全部评论

相关推荐

08-15 11:57
门头沟学院 Java
点赞 评论 收藏
分享
08-06 08:33
四川大学 Java
OPPO官方内推:卧槽!!!啥破公司啊!!!
投递OPPO等公司8个岗位
点赞 评论 收藏
分享
07-09 20:50
门头沟学院 Java
码农索隆:1.教育背景和荣誉证书合二为一。 2.获奖项目理一遍,你做了什么,对你求职的岗位有什么帮助,没有就删掉。 3.技能特长和教育背景交换位置。 4.技能特长写的太差,上网上找简历参考。都不用问你别的,一个redis就能把你问住,写写你具体会redis哪些方面的知识。
点赞 评论 收藏
分享
评论
1
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务