当前位置: 代码迷 >> Oracle开发 >> 求select语句解决方法
  详细解决方案

求select语句解决方法

热度:22   发布时间:2016-04-24 06:45:22.0
求select语句
有一个学生分数表
id       course      score
100    语文         80
100    数学         85
100    英语         90
101    语文         60
101    数学         70
101    英语         100
102    语文         100
102    数学         90
102    英语         90
...
求排序,
要求:每个学生的最高两门课程,如果分数相同,则全部写出。
结果
id       course      score
100    英语         90
100    数学         85 
101    英语         100
101    数学         70
102    语文         100
102    数学         90
102    英语         90


------解决方案--------------------
引用:
在线等啊求救

WITH tt AS(
SELECT 100 ID,'语文' course,80 score FROM dual UNION ALL
SELECT 100,'数学',85 FROM dual UNION ALL
SELECT 100,'英语',90 FROM dual UNION ALL
SELECT 101,'语文',60 FROM dual UNION ALL
SELECT 101,'数学',70 FROM dual UNION ALL
SELECT 101,'英语',100 FROM dual UNION ALL
SELECT 102,'语文',100 FROM dual UNION ALL
SELECT 102,'数学',90 FROM dual UNION ALL
SELECT 102,'英语',90 FROM dual )
SELECT ID,COURSE, SCORE
  FROM (SELECT ID,
               COURSE,
               SCORE,
               RANK() OVER(PARTITION BY ID ORDER BY SCORE DESC) MM
          FROM TT)
 WHERE MM <= 2

------解决方案--------------------
DENSE_RANK()
------解决方案--------------------
引用:
Quote: 引用:

DENSE_RANK()


能详细点吗?

SELECT ID,COURSE, SCORE   FROM (SELECT ID,                COURSE,                SCORE,                RANK() OVER(PARTITION BY ID ORDER BY SCORE DESC) MM           FROM TT)  WHERE MM <= 2

复杂?
------解决方案--------------------
引用:
Quote: 引用:

Quote: 引用:

Quote: 引用:

DENSE_RANK()


能详细点吗?

SELECT ID,COURSE, SCORE   FROM (SELECT ID,                COURSE,                SCORE,                RANK() OVER(PARTITION BY ID ORDER BY SCORE DESC) MM           FROM TT)  WHERE MM <= 2

复杂?


那个  RANK() OVER(PARTITION BY ID ORDER BY SCORE DESC) MM 它查出的值是什么啊?有点点小白

你可以单独查查看看,
SELECT ID,
       COURSE,
       SCORE,
       RANK() OVER(PARTITION BY ID ORDER BY SCORE DESC) MM
  FROM TT

就是分组排序并分配序号,按每个分组分配序号。。尤其是当有重复值是,分配的序号相同。。
具体over用法你可以百度一下。。
  相关解决方案