给定用户成绩表,编写SQL查询排名靠前的用户(例如前10名),并说明rank()和dense_rank()的区别。
要查询成绩表中排名靠前的用户(如前10名),需先明确排名依据(通常为成绩降序),再通过排序和限制结果行数实现。假设用户成绩表名为user_scores
,包含user_id
(用户ID)和score
(成绩)字段,基础查询语句如下:
SELECT user_id, score
FROM user_scores
ORDER BY score DESC
LIMIT 10;
不过,若存在成绩相同的情况,上述查询可能漏掉实际并列排名的用户。更严谨的方式是先使用排名函数生成排名,再筛选排名≤10的用户,例如:
WITH ranked_users AS (SELECT user_id, score, RANK() OVER (ORDER BY score DESC) AS rnkFROM user_scores
)
SELECT user_id, score, rnk
FROM ranked_users
WHERE rnk <= 10;
rank()
和dense_rank()
均为窗口函数,用于生成排名,但核心区别在于处理并列排名时的逻辑:
- rank()