LeetCode刷题之旅【数据库篇-6】 - 中等:178. 分数排名

2019年11月20日

目录

题目:分数排名

解题1

解题2

解题3

解题4


题目:分数排名

解题1

-- 子查询(分数去重,排名) 语句简洁,可惜列中加子查询性能真的很差
SELECT
	Score,
	(
		SELECT
			count(DISTINCT score)
		FROM
			Scores
		WHERE
			score >= s.score
	) AS Rank
FROM
	Scores s
ORDER BY
	Score DESC;

  • 这种方式虽然很简单,但是 在select语句中使用子查询来生成rank,相当于对每一条记录都需要查询一次scores表,查询次数为 (记录条数^2),会很慢,而且在数据量稍大的情况下真的可取吗?

 

解题2

照搬大神的题解进行语句解释,这么简单的方法我怎么就想不到呢?!

select

a.score as Score,

count(DISTINCT b.score) AS Rank # 统计b表符合条件的不重复的分数的数量作为排名

FROM scores a join scores b

where b.score >= a.score # 条件是这个分数不小于我,因为a、b表数据相同,所以排名值最小是1

group by a.id # a表中每个数据都进行排名

order by a.score DESC # 最后按分数(跟排名一样)降序排列


-- 聚合函数,两个相同表的自连接
SELECT
	a.Score,
	sum(
		CASE
		WHEN b.Score >= a.Score THEN
			1
		END
	) AS Rank
FROM
	Scores a,
	(
		SELECT DISTINCT
			Score
		FROM
			Scores
	) b
GROUP BY
	a.id
ORDER BY
	a.Score DESC;

 

解题3


SELECT Score,
    cast((CASE
    WHEN @prev = Score THEN @cur
    WHEN @prev := Score THEN @cur := @cur + 1
    WHEN Score <= 0 THEN @cur := @cur + 1
    END) as signed) AS Rank
FROM Scores,
(SELECT @cur := 0, @prev := null) r
ORDER BY 
    Score DESC;

 

解题4


SELECT
	d.Score,
	c.Rank
FROM
	Scores d
LEFT JOIN (
	SELECT
		@rowNum :=@rowNum + 1 AS 'Rank',
		s.Score
	FROM
		(
			SELECT DISTINCT
				Score
			FROM
				Scores
			ORDER BY
				Score DESC
		) s,
		(SELECT @rowNum := 0) b -- 行号
) c ON d.Score = c.Score
ORDER BY
	c.Rank;

 

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看REAdMe.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看READme.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值