2015-06-18 2 views
0

У меня есть таблица emp со всеми регулярными 14 строками. Я хочу написать запрос для сканирования таблицы и возврата следующим образом: означает, что он вернет результат, основанный на задании. Если он сначала видит президента, он возвращает эту строку, затем он сканирует на следующую работу, он видит менеджера и возвращает его, а не возвращает никакого другого менеджера и так далее. поэтому для каждого нового задания он видит, что возвращает эту строку и переходит к следующему новому заданию. БлагодаряНе удалось получить нужный результат по заданию

7839 KING PRESIDENT  17-NOV-81 5000  10 
7698 BLAKE MANAGER 7839 01-MAY-81 2850  30 
7788 SCOTT ANALYST 7566 19-APR-87 3000  20 
7369 SMITH CLERK 7902 17-DEC-80 800   20 

Пожалуйста, помогите

благодаря

+0

Вы хотите вернуть только строки, имеющие уникальную работу (название)? – Chuck

+0

Да, пожалуйста, не макс или мин, только первая строка, встречающаяся с новым названием задания, хранящаяся в таблице emp в любом порядке – Lara

ответ

2

Это вернет первый человек (по алфавиту упорядоченных фамилий) для каждого задания:

SELECT EMPLOYEE_ID, 
     LAST_NAME, 
     JOB_TITLE, 
     MANAGER_ID, 
     HIRE_DATE, 
     SALARY, 
     DEPARTMENT_ID 
FROM (
     SELECT e.EMPLOYEE_ID, 
       e.LAST_NAME, 
       j.JOB_TITLE, 
       e.MANAGER_ID, 
       e.HIRE_DATE, 
       e.SALARY, 
       e.DEPARTMENT_ID, 
       ROW_NUMBER() OVER (PARTITION BY e.JOB_ID ORDER BY e.LAST_NAME) AS RN 
     FROM HR.EMPLOYEES e 
       INNER JOIN 
       HR.JOBS j 
       ON (e.JOB_ID = j.JOB_ID) 
    ) 
WHERE RN = 1; 

Выход:

(My EMPLOYEES стол имеет 109 рядов ... есть 19 разных заданий)

EMPLOYEE_ID LAST_NAME     JOB_TITLE       MANAGER_ID HIRE_DATE  SALARY DEPARTMENT_ID 
----------- ------------------------- ----------------------------------- ---------- --------- ---------- ------------- 
     206 Gietz      Public Accountant       205 07-JUN-02  8300   110 
     205 Higgins     Accounting Manager       101 07-JUN-02  12008   110 
     200 Whalen     Administration Assistant     101 17-SEP-03  4400   10 
     100 King      President          17-JUN-03  24000   90 
     102 De Haan     Administration Vice President    100 13-JAN-01  17000   90 
     110 Chen      Accountant         108 28-SEP-05  8200   100 
     108 Greenberg     Finance Manager       101 17-AUG-02  12008   100 
     203 Mavris     Human Resources Representative    101 07-JUN-02  6500   40 
     105 Austin     Programmer         103 25-JUN-05  4800   60 
     201 Hartstein     Marketing Manager       100 17-FEB-04  13000   20 
     202 Fay      Marketing Representative     201 17-AUG-05  6000   20 
     204 Baer      Public Relations Representative   101 07-JUN-02  10000   70 
     116 Baida      Purchasing Clerk       114 24-DEC-05  2900   30 
     114 Raphaely     Purchasing Manager       100 07-DEC-02  11000   30 
     148 Cambrault     Sales Manager        100 15-OCT-07  11000   80 
     174 Abel      Sales Representative      149 11-MAY-04  11000   80 
     192 Bell      Shipping Clerk        123 04-FEB-04  4000   50 
     130 Atkinson     Stock Clerk        121 30-OCT-05  2800   50 
     121 Fripp      Stock Manager        100 10-APR-05  8200   50 
+0

ROW_NUMBER() OVER (PARTITION by e.JOB_TITLE ORDER BY e.LAST_NAME) AS RN ---- partition by JOB_TITLE будет help – Aishu

+0

@Aishu 'JOB_TITLE' не находится в таблице« СОТРУДНИКИ ». Я решил разделить на 'JOB_ID', поскольку, если только два задания с одним и тем же заголовком и разными идентификаторами (а не по умолчанию), то разделение на' JOB_ID' будет делать то же самое и может позволить использовать индекс (который 'JOB_ID 'имеет с его первичного ключа, но' JOB_TITLE' не делает). Вы можете разбивать на 'JOB_TITLE', если хотите, но есть причины, по которым я это рассматривал, и не сделал этого. – MT0

+0

Спасибо, ребята, он работает – Lara

Смежные вопросы