一条sql语句查询成绩排名
首先問題:
然后答案:
SELECTa.id,a.score AS Score,COUNT( DISTINCT b.score ) AS Rank FROMscores a,scores b WHEREb.score >= a.score GROUP BYa.id ORDER BYa.score DESC分步驟理解(sql拆解理解):
前提:要簡單理解sql執行順序, 和"笛卡爾積"的概念?
拆解之后得到結果:
id score id(1) score(1) 1 3.50 1 3.50 2 3.65 1 3.50 3 4.00 1 3.50 4 3.85 1 3.50 5 4.00 1 3.50 6 3.65 1 3.50 1 3.50 2 3.65 2 3.65 2 3.65 3 4.00 2 3.65 4 3.85 2 3.65 5 4.00 2 3.65 6 3.65 2 3.65 1 3.50 3 4.00 2 3.65 3 4.00 3 4.00 3 4.00 4 3.85 3 4.00 5 4.00 3 4.00 6 3.65 3 4.00 1 3.50 4 3.85 2 3.65 4 3.85 3 4.00 4 3.85 4 3.85 4 3.85 5 4.00 4 3.85 6 3.65 4 3.85 1 3.50 5 4.00 2 3.65 5 4.00 3 4.00 5 4.00 4 3.85 5 4.00 5 4.00 5 4.00 6 3.65 5 4.00 1 3.50 6 3.65 2 3.65 6 3.65 3 4.00 6 3.65 4 3.85 6 3.65 5 4.00 6 3.65 6 3.65 6 3.65可以看到聯表查詢不加條件產生"笛卡爾積"后的結果是36條記錄
相當于score(成績)的6條記錄每條之間都列了出來?
多加了一個where條件,結果如下:
id score id(1) score(1) 1 3.50 1 3.50 1 3.50 2 3.65 2 3.65 2 3.65 6 3.65 2 3.65 1 3.50 3 4.00 2 3.65 3 4.00 3 4.00 3 4.00 4 3.85 3 4.00 5 4.00 3 4.00 6 3.65 3 4.00 1 3.50 4 3.85 2 3.65 4 3.85 4 3.85 4 3.85 6 3.65 4 3.85 1 3.50 5 4.00 2 3.65 5 4.00 3 4.00 5 4.00 4 3.85 5 4.00 5 4.00 5 4.00 6 3.65 5 4.00 1 3.50 6 3.65 2 3.65 6 3.65 6 3.65 6 3.65以上結果把"b表"的成績(score) 大于 "a表"的成績的記錄都篩選出來記錄數是23條
此時score(1)的字段全部都是大于等于score字段的
根據以上結果我們在加一個排序
SELECT* FROMscores a,scores b WHEREb.score >= a.score ORDER BY a.id得到結果:
id score id(1) score(1) 1 3.50 6 3.65 1 3.50 4 3.85 1 3.50 1 3.50 1 3.50 2 3.65 1 3.50 5 4.00 1 3.50 3 4.00 2 3.65 6 3.65 2 3.65 4 3.85 2 3.65 2 3.65 2 3.65 5 4.00 2 3.65 3 4.00 3 4.00 5 4.00 3 4.00 3 4.00 4 3.85 4 3.85 4 3.85 5 4.00 4 3.85 3 4.00 5 4.00 5 4.00 5 4.00 3 4.00 6 3.65 6 3.65 6 3.65 4 3.85 6 3.65 2 3.65 6 3.65 5 4.00 6 3.65 3 4.00可以看到 id為1 成績3.50的 大于他的有6條記錄, id為2 成績3.65的 大于他的有5條記錄, 以此類推把6個成績都想象出來
最后我們根據id分組(GROUP BY), 再把"b表"的成績去重(DISTINCT)再記總數(COUNT)
SELECTa.id,a.score AS Score,COUNT( DISTINCT b.score ) AS Rank FROMscores a,scores b WHEREb.score >= a.score GROUP BYa.id此sql不太好理解的就是"?COUNT( DISTINCT b.score ) AS Rank? "這段
結合步驟3(也就是上面的)結果 舉例一個來理解這句sql:
id為1 成績3.50的 大于他的有6條記錄, 分別是?3.65,?3.85,?3.50,?3.65,?4.00,?4.00
我們看到這6條記錄去掉重復后剩下?3.65,?3.85, 3.50,?4.00 這4個, 也就說明成績 3.50有4個大于等于他的,那么最高只能排名第4
這就是上面去重求和的作用, 求的和就是他的最高排名
補充上完整的sql
SELECTa.id,a.score AS Score,COUNT( DISTINCT b.score ) AS Rank FROMscores a,scores b WHEREb.score >= a.score GROUP BYa.id ORDER BYa.score DESC結果:
id Score Rank 3 4.00 1 5 4.00 1 4 3.85 2 2 3.65 3 6 3.65 3 1 3.50 4菜鳥分享, 大佬勿噴
總結
以上是生活随笔為你收集整理的一条sql语句查询成绩排名的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 如何提取出一首歌曲的梅尔频谱
- 下一篇: 《秒杀系统架构设计》学习