在sql中选择两个最大查询


Selecting two max queries in sql

我想知道如何在查询中使用two-max函数,我有这个查询

SELECT g.studentid, g.blockcode, sb.subjectcode, sb.daystart, sb.dayend, sb.stime, sb.sday, ii.firstname instructorname,  ii.lastname instructorlastname, sb.roomcode, r.building, d.description, rr.studentid,rr.sem, rr.sy
            FROM grades g 
            JOIN subjectblocking sb ON g.blockcode=sb.blockcode
            JOIN instructorinfo ii ON sb.instructorid=ii.instructorid
            JOIN subjects d ON sb.subjectcode = d.subjectcode
            JOIN room r ON sb.roomcode=r.roomcode
            JOIN register rr ON rr.studentid=g.studentid
            WHERE g.studentid='2011-S1308'
            AND rr.sem=(SELECT max(sem) from register
            WHERE sy= (SELECT max(sy) from register))
            ORDER BY  sb.daystart ASC, sb.stime like '%AM%' DESC;

我之所以使用两个最大值,是因为我希望学期和学年都在最大值上,这样学生就可以查看他们的最新时间表。我应该如何同时最大化它们?此外,我的查询中的问题是只有1个最大值有效,即最大值(sem)。提前谢谢!

您需要的是使用

MAX(your_column) OVER (PARTITION BY semester_column) max_by_semester
MAX(your_column) OVER (PARTITION BY year_column) max_by_year

通过这种方式,您将获得由PARTITION by子句选择的列值所选择的数据切片的最大值。

以这种方式使用MAX不是一个聚合函数,而是一个窗口函数,行为非常不同,您不需要Group By

您可以在此处找到有关Window函数的更多信息。

要使查询工作,您需要sy/sem组合的最大值,而不是单独使用。我认为查询看起来像:

SELECT g.studentid, g.blockcode, sb.subjectcode, sb.daystart, sb.dayend, sb.stime, sb.sday,
       ii.firstname instructorname, ii.lastname instructorlastname,
       sb.roomcode, r.building, d.description, rr.studentid, rr.sem, rr.sy
FROM grades g JOIN
     subjectblocking sb
     ON g.blockcode = sb.blockcode JOIN
     instructorinfo ii
     ON sb.instructorid = ii.instructorid JOIN
     subjects d
     ON sb.subjectcode = d.subjectcode JOIN
     room r
     ON sb.roomcode = r.roomcode JOIN
     register rr
     ON rr.studentid = g.studentid
WHERE g.studentid = '2011-S1308' AND
      (sy, rr.sem) = (select sy, sem from register order by sy desc, sem desc limit 1)
ORDER BY sb.daystart ASC, sb.stime like '%AM%' DESC;