Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 同时使用group by和order by_Sql_Oracle - Fatal编程技术网

Sql 同时使用group by和order by

Sql 同时使用group by和order by,sql,oracle,Sql,Oracle,我很难将order by函数与group by函数结合起来 我想找出三年中出勤率最高的学生 表: 学生 studentPIN | fName | lName | StudyYear 1 x x 1 2 x x 2 3 x x 3 4 x x 2 阿滕丹塞洛 注意状态是指他们是否

我很难将order by函数与group by函数结合起来

我想找出三年中出勤率最高的学生

表:

学生

studentPIN | fName | lName | StudyYear 

    1          x       x         1
    2          x       x         2
    3          x       x         3
    4          x       x         2
阿滕丹塞洛 注意状态是指他们是否参加了课程

ClassID | StudentPin | Status 
   12          1         NO
   23          2         YES
   34          3         YES
目前,我已经能够计算出每个学生上课的次数

这就是我目前正在处理的问题:

Select student.fname, student.lname, STUDENT.STUDYYEAR,
SUM(CASE ATTENDANCELOG.STATUS WHEN 'YES' THEN 1 ELSE NULL END) AS Attended 
from student 
Join ATTENDANCELOG on student.studentpin=ATTENDANCELOG.studentpin
GROUP BY STUDENT.STUDYYEAR, STUDENT.FNAME, STUDENT.LNAME
我只是被困在如何排序结果从最高出席率到最低,然后选择前一个为每3年

谢谢。

使用
行号()


尝试此操作后,如果所有措辞都正确,它只会提示存在无效标识符?您使用的是哪个版本的Oracle DB server?@Hilarion SQL Developer 18.1.0SQL Developer是用于访问DB server的客户端应用程序,而不是DB server本身。您可以尝试执行其中一个查询,以获取数据库服务器的版本号:
SELECT*FROM PRODUCT\u COMPONENT\u version
SELECT*FROM V$version
select fname, lname, studyyear, attended
from (select s.fname, s.lname, s.STUDYYEAR,
             SUM(CASE al.STATUS WHEN 'YES' THEN 1 ELSE 0 END) AS Attended,
             row_number() over (partition by s.studyyear
                                order by SUM(CASE al.STATUS WHEN 'YES' THEN 1 ELSE 0 END) desc
                               ) as seqnum
      from student s Join
           ATTENDANCELOG al
           on s.studentpin = al.studentpin
      group by s.STUDYYEAR, s.FNAME, s.LNAME
     ) s
where seqnum = 1;
Select student.fname, student.lname, STUDENT.STUDYYEAR,
SUM(CASE ATTENDANCELOG.STATUS WHEN 'YES' THEN 1 ELSE NULL END) AS Attended 
from student 
Join ATTENDANCELOG on student.studentpin=ATTENDANCELOG.studentpin
GROUP BY STUDENT.STUDYYEAR, STUDENT.FNAME, STUDENT.LNAME
ORDER BY 4 desc;