如何在查询包含聚合函数时向查询结果"添加"列?

Har*_*ris 5 sql aggregate greatest-n-per-group

我有一张名为'出勤'的表格,用于记录学生在课程中的出勤时间.此表有4列,例如'id','course_id','attendance_time'和'student_name'.此表中的少数记录的示例是:

23 100 1/1/2010 10:00:00汤姆

24 100 1/1/2010 10:20:00鲍勃

25 187 1/2/2010 08:01:01丽莎

.....

我想创建每门课程最新出勤时间的摘要.我在下面创建了一个查询:

SELECT course_id, max(attendance_time) FROM attendance GROUP BY course_id
Run Code Online (Sandbox Code Playgroud)

结果将是这样的

100 1/1/2010 10:20:00

187 1/2/2010 08:01:01

现在,我想要做的就是在上面的结果中添加'id'列.怎么做?

我不能只是将命令改为这样的东西

SELECT id, course_id, max(attendance_time) FROM attendance GROUP BY id, course_id
Run Code Online (Sandbox Code Playgroud)

因为它会返回所有记录,就像没有使用聚合函数一样.请帮我.

Mar*_*ers 7

这是典型的"每组最大","每组最大n"或"分组最大"查询,几乎每天都会出现在Stack Overflow上.您可以搜索Stack Overflow以查找这些术语,以查找有关如何使用不同数据库解决此问题的许多不同示例.解决它的一种方法如下:

SELECT
    T2.course_id,
    T2.attendance_time
    T2.id
FROM (
    SELECT
        course_id,
        MAX(attendance_time) AS attendance_time
    FROM attendance
    GROUP BY course_id
) T1
JOIN attendance T2
ON T1.course_id = T2.course_id
AND T1.attendance_time = T2.attendance_time
Run Code Online (Sandbox Code Playgroud)

请注意,如果有多个行具有相同的attendance_time,则此查询理论上可以为每个course_id返回多行.如果不能发生这种情况,那么您无需担心此问题.如果这是一个潜在的问题,那么您可以通过在course_id,attendance_time上添加额外的分组并选择最小或最大ID来解决此问题.