SELECT STATUS,
AVG(COUNT(CRIME_ID)) "Avg # of Crimes per Status"
FROM CRIMES
GROUP BY STATUS;
当我尝试运行它时,我得到“不是按功能分组的单组”。如您所见,我已将非聚合列包含在 group by 列表中。当它从 SELECT 列表中删除时,它会运行,但我需要用它运行它。问题是什么?
Oracle 实际上确实允许嵌套其早期版本中的两个聚合函数,但这样做意味着有两个聚合,第一个带有 GROUP BY 子句,但后面的一个 - 没有。
这意味着我们无法选择 GROUP BY 中的列 -
这就是错误的根源。
通过从子句中删除STATUS
列,我们得到一个有效的查询:SELECT
SELECT AVG(COUNT(CRIME_ID)) "Avg # of Crimes per Status"
FROM CRIMES
GROUP BY STATUS;
每个状态的平均犯罪数量 |
---|
3.33333333333333333333333333333333333333 |
”你可以嵌套聚合函数。例如,下面的例子计算了 scott 模式中所有部门的最高薪水的平均值:
SELECT AVG(MAX(salary)) FROM employees GROUP BY department_id;
平均(最高(工资))
`----------------
10925此计算评估由 GROUP BY 子句 (deptno) 定义的每个组的内部聚合 (MAX(sal)),并再次聚合结果。”
在选择组时,Oracle 不允许以这种方式嵌套两个聚合函数。子查询计数查询,然后取平均值:
SELECT AVG(cnt)
FROM
(
SELECT STATUS, COUNT(CRIME_ID) AS cnt
FROM CRIMES
GROUP BY STATUS
) t;
请注意,您可以尝试:
SELECT AVG(COUNT(CRIME_ID)) OVER () AS avg
FROM CRIMES
GROUP BY STATUS
ORDER BY STATUS
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;
在这里,我们AVG()
将结果集中所有组用作分析函数。然后,我们将输出限制为一行。