給定用戶成績表,編寫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()