我有一张这样的表:
EMPNO ENAME JOB MGR
7369 SMITH CLERK 7902
7499 ALLEN SALESMAN 7698
7521 WARD SALESMAN 7698
7566 JONES MANAGER 7839
7654 MARTIN SALESMAN 7698
7698 BLAKE MANAGER 7839
7782 CLARK MANAGER 7839
7788 SCOTT ANALYST 7566
7839 KING PRESIDENT null
7844 TURNER SALESMAN 7698
7876 ADAMS CLERK 7788
7900 JAMES CLERK 7698
7902 FORD ANALYST 7566
7934 MILLER CLERK 7782
我需要选择只有2名员工的所有经理(英语.MGR字段必须等于MANAGER的EMPNO)
我可以使用PARTITION或其他OLAP功能吗?
答案 0 :(得分:2)
例如:
SELECT manager_id
FROM employees
GROUP BY manager_id
HAVING count(employee_id)=2
答案 1 :(得分:2)
我可以使用PARTITION吗
不确定。分析肯定会这样做。使用 COUNT()OVER()。
例如,在SCOTT模式中使用标准EMP表:
SQL> WITH DATA AS(
2 SELECT e.*, count(empno) OVER(PARTITION BY mgr ORDER BY NULL) cnt
3 FROM emp e
4 )
5 SELECT empno, ename, mgr
6 FROM DATA
7 WHERE cnt = 2;
EMPNO ENAME MGR
---------- ---------- ----------
7902 FORD 7566
7788 SCOTT 7566
答案 2 :(得分:1)
您可以使用子查询:
SELECT * FROM employees e1 WHERE (SELECT COUNT(*) FROM employees e2 WHERE e2.MGR = e1.EMPNO) >= 2
答案 3 :(得分:0)
设法做到这一点:
SELECT data.mgr, d.ENAME
FROM EMP d
INNER JOIN (SELECT DISTINCT e.MGR, count(empno) OVER(PARTITION BY mgr ORDER BY NULL) cnt FROM emp e) data
ON data.mgr = d.EMPNO
WHERE cnt = 2;
是否有更好/更好或更短的方式?