查找 min(sal) 以及员工姓名 SQL Oracle

Find min(sal) along with employee name SQL Oracle

我有 table 打电话给 emp,我正试图找到薪水最低的文员。我的代码 select min(sal) as min from emp where job='CLERK'; 工作正常,我得到这个:

  MIN
----------
       800

但我还想显示店员的姓名 Smith。当我 运行 这个代码 select ename, min(sal) as min from emp where job='CLERK' group by name; 它给了我 table 中的所有文员,这不是我想要的。这是我的 table:

的片段
CREATE TABLE EMP
       (EMPNO NUMBER(4) NOT NULL,
        ENAME VARCHAR2(10),
        JOB VARCHAR2(9),
        MGR NUMBER(4),
        HIREDATE DATE,
        SAL NUMBER(7, 2),
        COMM NUMBER(7, 2),
        DEPTNO NUMBER(2));
INSERT INTO EMP VALUES
        (7369, 'SMITH',  'CLERK',     7902,
        TO_DATE('17-DEC-1980', 'DD-MON-YYYY'),  800, NULL, 20);
INSERT INTO EMP VALUES
        (7499, 'ALLEN',  'SALESMAN',  7698,
        TO_DATE('20-FEB-1981', 'DD-MON-YYYY'), 1600,  300, 30);

您可以使用 row_number:

select ename, sal as min
from (
  select ename, sal,
         row_number() over (order by sal) as rn  
  from emp 
  where job='CLERK' ) t
where t.rn = 1

您可以使用子查询和排名函数来做到这一点:

select e.*
from (select e.*,
             dense_rank() over (partition by job order by salary) as seqnum
      from emp
      where job = 'CLERK' 
     ) e
where seqnum = 1;

如果有联系,这将 return 多行。如果你只想要一个,你可以使用 row_number() 而不是 dense_rank()

并且,如果您希望所有职员的姓名作为单个分隔值,则可以使用 list_agg():

select listagg(e.name, ', ') within group (order by e.name) as names
from (select e.*,
             dense_rank() over (partition by job order by salary) as seqnum
      from emp
      where job = 'CLERK' 
     ) e
where seqnum = 1;

试试这个

SELECT * FROM emp 
WHERE SAL = (select MIN(SAL) sal from emp WHERE JOB ='CLERK')
and JOB ='CLERK';