Если ваши данные не могут иметь повторяющиеся значения TYPE и recordNumber внутри employeeNumber, тогда ответ @ Florin сработает. В противном случае, если есть хоть какой-то шанс, что ваш ORDER BY в аналитической функции даст две строки с одинаковым рангом, вы снова получите повторяющиеся строки. Вместо этого я бы использовал ROW_NUMBER, и предложение WHERE можно упростить, чтобы просто выбрать все строки с номером строки 1 (что можно сделать и с помощью запроса @ Florin):
CREATE TABLE employees (employeeNumber INTEGER, recordNumber INTEGER
, job VARCHAR2(100), dept INTEGER, TYPE VARCHAR2(2));
INSERT INTO employees VALUES (12, 6, 'paper pusher', 400, 'S');
INSERT INTO employees VALUES (18, 2, 'phone cleaner', 600, 'P');
INSERT INTO employees VALUES (18, 4, 'sweeper', 567, 'S');
INSERT INTO employees VALUES (19, 0, 'typist', 400, 'S');
INSERT INTO employees VALUES (21, 0, 'mouse ball cleaner', 400, 'P');
INSERT INTO employees VALUES (12, 1, 'stapler', 788, 'S');
INSERT INTO employees VALUES (12, 1, 'stapler2', 654, 'S');
SELECT employeeNumber, recordNumber, job, dept, type
FROM (SELECT employeeNumber, recordNumber, job, dept, type
, ROW_NUMBER()
OVER (PARTITION BY employeeNumber
ORDER BY type, recordNumber) rn
FROM employees)
WHERE rn = 1;
Выходит так:
EMPLOYEENUMBER RECORDNUMBER JOB DEPT TYPE
-------------- ------------- -------------------- ----- ----
12 1 stapler 788 S
18 2 phone cleaner 600 P
19 0 typist 400 S
21 0 mouse ball cleaner 400 P
Использование RANK с этими данными даст 2 строки для сотрудника 12. Конечно, если этого не произойдет, возможно, вы захотите, чтобы ваш запрос сообщил об этом факте.