我有一张员工表,其中包含姓名,工作日期和更多信息。
我想查看雇员人数最多的是哪一年。
我写了一个计算每年就业的查询:
SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
FROM employees e1
GROUP BY EXTRACT (YEAR FROM e1.empl_date);
此查询的结果是元组:
YEAR | EMPL_NUMBER
1993 | 3
1997 | 2
依旧......
现在我想获得最大的EMPL_NUMBER:
SELECT YEAR, MAX(EMPL_NUMBER)
FROM (SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
FROM employees e1
GROUP BY EXTRACT (YEAR FROM e1.empl_date));
然后我收到一个错误:
ORA-00937: not a single-group group function
我不明白为什么我会收到错误,因为子查询会返回2列的元组。
答案 0 :(得分:1)
您正在选择结果上使用聚合函数,因此如果您需要所有不同的YEAR,则按
分组 SELECT T.YEAR, MAX(T.EMPL_NUMBER)
FROM (
SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
FROM employees e1
GROUP BY EXTRACT (YEAR FROM e1.empl_date)
) T
GROUP BY T.YEAR ;
否则,如果你需要MAX的年份(EMPL_NUMBER),你可以
SELECT T.YEAR, T.EMPL_NUMBER
FROM (
SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
FROM employees e1
GROUP BY EXTRACT (YEAR FROM e1.empl_date)
) T
WHERE (T.EMPL_NUMBER) IN (SELECT MAX(EMPL_NUMBER)
FROM (
SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
FROM employees e1
GROUP BY EXTRACT (YEAR FROM e1.empl_date)
) T1 )
答案 1 :(得分:0)
在Oracle 12C中,您可以执行以下操作:
SELECT EXTRACT(YEAR FROM e1.empl_date) AS YEAR, COUNT(e1.id_empl) AS EMPL_NUMBER
FROM employees e1
GROUP BY EXTRACT(YEAR FROM e1.empl_date)
ORDER BY COUNT(e1.id_empl) DESC
FETCH FIRST 1 ROW ONLY;
答案 2 :(得分:0)
执行此操作的一种方法是使用聚合查询,然后再使用聚合函数。例如,使用FIRST/LAST
函数(并使用SCOTT
架构,EMP
表进行说明):
select min(extract(year from hiredate)) keep (dense_rank last order by count(empno)) as yr,
max(count(empno)) as emp_count
from emp
group by extract(year from hiredate)
;
YR EMP_COUNT
---- ---------
1981 10
此解决方案存在两个问题。首先,许多开发人员(包括许多有经验的开发人员)似乎没有意识到FIRST / LAST功能,或者不愿意使用它。另一个更严重的问题是,在这个问题中,有几年可能有相同,最多的雇员。问题要求必须比原始帖子更详细。当有第一名的关系时,期望的输出是什么?
上述查询返回了达到最高雇员时所有不同年份中最早的一年。将MIN
条款中的SELECT
更改为MAX
,您将获得最多招聘人数最多的一年。但是,我们通常需要一个查询,在关联的情况下,将返回所有与大多数雇员相关的年份。使用FIRST/LAST
功能无法完成 。
为此,紧凑型解决方案会为您的原始查询添加分析功能,以按招聘人数对年份进行排名。然后在外部查询中只过滤rank = 1的行。
select yr, emp_count
from (
select extract(year from hiredate) as yr, count(empno) as emp_count,
rank() over (order by count(empno) desc) as rnk
from emp
group by extract(year from hiredate)
)
where rnk = 1
;
或者,使用子查询的max()
子句中的SELECT
分析函数(而不是秩类型分析函数):
select yr, emp_count
from (
select extract(year from hiredate) as yr, count(empno) as emp_count,
max(count(empno)) over () as max_count
from emp
group by extract(year from hiredate)
)
where emp_count = max_count
;
答案 3 :(得分:0)
我假设您想要一行显示大多数人雇用的年份:
SELECT * FROM (
SELECT EXTRACT (YEAR FROM e1.empl_date) AS YEAR,
COUNT(e1.id_empl) AS EMPL_NUMBER
FROM employees e1
GROUP BY EXTRACT (YEAR FROM e1.empl_date)
ORDER BY COUNT(*))
WHERE ROWNUM=1;