使用聚合函数而不将它们包含在 SELECT 中
Using aggregate functions without including them in SELECT
假设我有一个包含学校 类 的数据库,我想找到学生 ID 号最低的一年级、三年级和五年级 类,但我只想return结果集中的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)
这 return 与以下相同的 ClassID 列表:
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 年级最低的 studentId,然后告诉我 class s/he 的内容' 有 2 个步骤。所以我认为嵌套查询可能是最简单的事情,比如:
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
如果您想要三个 class 中最低的学号,请使用 order by
和 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;
如果您想要此信息 per class,请使用 row_number()
:
SELECT ClassId, Grade
FROM (SELECT Classes.ClassID, Classes.Grade,
ROW_NUMBER() OVER (PARTITION BY Classes.ClassID ORDER BY StudentId ASC) as seqnum
FROM Classes INNER JOIN
Students
ON Classes.ClassID = Students.ClassID
WHERE Classes.Grade IN (1, 3, 5)
) c
WHERE seqnum = 1;
您不需要 group by
。
假设我有一个包含学校 类 的数据库,我想找到学生 ID 号最低的一年级、三年级和五年级 类,但我只想return结果集中的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)
这 return 与以下相同的 ClassID 列表:
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 年级最低的 studentId,然后告诉我 class s/he 的内容' 有 2 个步骤。所以我认为嵌套查询可能是最简单的事情,比如:
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
如果您想要三个 class 中最低的学号,请使用 order by
和 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;
如果您想要此信息 per class,请使用 row_number()
:
SELECT ClassId, Grade
FROM (SELECT Classes.ClassID, Classes.Grade,
ROW_NUMBER() OVER (PARTITION BY Classes.ClassID ORDER BY StudentId ASC) as seqnum
FROM Classes INNER JOIN
Students
ON Classes.ClassID = Students.ClassID
WHERE Classes.Grade IN (1, 3, 5)
) c
WHERE seqnum = 1;
您不需要 group by
。