在聚合函数中选择

Posted

技术标签:

【中文标题】在聚合函数中选择【英文标题】:SELECT inside Aggregate Function 【发布时间】:2021-08-28 17:44:37 【问题描述】:

假设我有 3 个这样的表:

class
id
capacity

student
id

student_class
id_student
id_class
SELECT c.id
FROM student_class sc
JOIN class c
  ON c.id=sc.id_class
JOIN student s
  ON s.id=sc.id_student
HAVING MAX((SELECT(COUNT(sc2.id) FROM student_class sc2 WHERE sc2.id_student=s.id AND sc2.id_course=c.id)/c.capacity))

我想找到注册/容量比率最高的课程。

我应该在聚合函数中使用 select 子句来编写像这样的 having 子句吗?

HAVING MAX((query that gives me the total number of students enrolled in a course)/course capacity))

或者有更好的方法吗?

【问题讨论】:

请提供样本数据和期望的结果。你的问题没有任何意义,除非MAX() 可以返回NULL0 @GordonLinoff 我编辑提供示例数据 【参考方案1】:

我想找到注册/容量比率最高的课程。

您将使用聚合来计算比率。然后您可以使用ORDER BYLIMIT 返回一个值。请注意,即使有平局,这也会返回一行:

SELECT c.id, COUNT(*) / c.capacity as ratio
FROM student_class sc JOIN
     class c
     ON c.id = sc.id_class
GROUP BY c.id, c.capacity
ORDER BY ratio DESC
LIMIT 1;

【讨论】:

谢谢!所以一般来说不可能在聚合函数中使用查询的结果吧? @Mizzet 。 . .有可能的。它只是没有做你想做的事。 在我写的情况下,那有 max 子句会给我带来什么? @Mizzet 。 . .首先,在大多数数据库中它是不允许的,因为没有GROUP BYmysql 扩展了HAVING 子句的使用。它将不返回任何行(如果条件评估为 0 或 NULL)或在其他情况下返回所有行。

以上是关于在聚合函数中选择的主要内容,如果未能解决你的问题,请参考以下文章

PostgreSQL中的选择或布尔聚合函数

是否可以在相同的选择中重用聚合函数结果?

选择列表中的无效表达式(不包含在聚合函数或 GROUP BY 子句中)

postgreSQL 选择聚合函数中未使用的附加列

sql聚合函数的应用

列“在选择列表中无效,因为它不包含在聚合函数或 GROUP BY 子句中”