Sql 使用聚合函数而不将其包含在SELECT中

Sql 使用聚合函数而不将其包含在SELECT中,sql,sql-server,greatest-n-per-group,Sql,Sql Server,Greatest N Per Group,假设我有一个包含学校班级的数据库,我想找到1、3和5年级的班级,这些班级的学生ID号最低,但我只想返回结果集中的ClassID(而不是学生编号) 编辑:我现在意识到这不是解决我真正问题的完美模式。更新它以更恰当地反映问题 我发现的唯一方法是: SELECT ClassID FROM Classes INNER JOIN Students ON Classes.ClassID = Students.ClassID WHERE Classes.Grade IN

假设我有一个包含学校班级的数据库,我想找到1、3和5年级的班级,这些班级的学生ID号最低,但我只想返回结果集中的ClassID(而不是学生编号)

编辑:我现在意识到这不是解决我真正问题的完美模式。更新它以更恰当地反映问题

我发现的唯一方法是:

SELECT 
    ClassID
FROM 
    Classes 
INNER JOIN
    Students ON Classes.ClassID = Students.ClassID
WHERE 
    Classes.Grade IN (1, 3, 5)
GROUP BY 
    Classes.ClassID
HAVING 
    MIN(StudentID) = MIN(StudentID)
 SELECT 
        ClassID,
        MIN(StudentID)
    FROM 
        Classes 
    INNER JOIN
        Students ON Classes.ClassID = Students.ClassID
    WHERE 
        Classes.Grade IN (1, 3, 5)
    GROUP BY 
        Classes.ClassID
这将返回与以下相同的ClassID列表:

SELECT 
    ClassID
FROM 
    Classes 
INNER JOIN
    Students ON Classes.ClassID = Students.ClassID
WHERE 
    Classes.Grade IN (1, 3, 5)
GROUP BY 
    Classes.ClassID
HAVING 
    MIN(StudentID) = MIN(StudentID)
 SELECT 
        ClassID,
        MIN(StudentID)
    FROM 
        Classes 
    INNER JOIN
        Students ON Classes.ClassID = Students.ClassID
    WHERE 
        Classes.Grade IN (1, 3, 5)
    GROUP BY 
        Classes.ClassID

这似乎有效,但在我看来很有趣。这是唯一的方法吗?

在“获得5年级最低的学生ID,然后告诉我他/她在哪个班级”中有两个步骤。因此我认为嵌套查询可能是最简单的方法,例如:

Select ClassId 
From Students
Join 
    ( Select Classes.Grade, Min(StudentId) as StudentId
        From Classes 
        Join Students ON Classes.ClassID = Students.ClassID
        Where Classes.Grade  in (1, 3, 5)
        Group By Classes.Grade 
        ) LowestStudentIdPerGrade
    On Students.StudentId = LowestStudentIdPerGrade.StudentId

如果您想要三个班级中最低的学生id,请使用
orderby
top

SELECT TOP 1 Classes.ClassID
FROM Classes INNER JOIN
     Students
     ON Classes.ClassID = Students.ClassID
WHERE Classes.Grade IN (1, 3, 5)
ORDER BY StudentId ASC;
如果需要每个类的此信息,请使用
行号()


对此,您不需要
分组依据

如果学生ID最低的学生不在五年级的班上怎么办?内部连接和where子句应该可以防止这种情况。HAVING子句是错误的。它是没有意义的,因为它与同一个值进行比较。这就像写1=1一样。@ZoharPeled-它的计算结果并不总是正确的。它实际上在语义上等同于
MIN(StudentID)不为NULL