Мне просто нужно, чтобы получить самый высокооплачиваемый работник в городе - PullRequest
0 голосов
/ 15 декабря 2018

Я пытаюсь получить новое представление, в котором я могу отображать ОДНУ запись для наиболее высокооплачиваемого сотрудника в каждом магазине.

Вывод (ОПРЕДЕЛЕНО) Отображение ТОП-сотрудника с оплатой труда в каждом магазине STORE_ID - 1 не имеет сотрудниковпоэтому его нет в отчете

ENAME   JOB         STORE_ID    MAX(SAL)    CITY
ALLEN   SALESMAN    2           1600        New York City
KING    PRESIDENT   3           5000        Chicago
SCOTT   ANALYST     4           3000        Philadelphia

АКТУАЛЬНЫЙ ВЫХОД

ENAME   JOB STORE_ID    MAX(SAL)    CITY
ALLEN   SALESMAN    2   1600    New York City
TURNER  SALESMAN    2   1500    New York City
WARD    SALESMAN    2   1250    New York City
MARTIN  SALESMAN    2   1250    New York City
KING    PRESIDENT   3   5000    Chicago
BLAKE   MANAGER 3   2850    Chicago
CLARK   MANAGER 3   2450    Chicago
SCOTT   ANALYST 4   3000    Philadelphia
FORD    ANALYST 4   3000    Philadelphia
JONES   MANAGER 4   2975    Philadelphia
MILLER  CLERK   4   1300    Philadelphia
ADAMS   CLERK   4   1100    Philadelphia
JAMES   CLERK   4   950 Philadelphia
SMITH   CLERK   4   800 Philadelphia

Я могу использовать только SELECT, GROUP BY, HAVING, ORDER BY, INNER JOIN (или другие типы JOINS).Я не могу использовать раздел, WITH

Этот QUERY действительно производит необходимые строки, но он содержит все остальные (в дополнение к самой высокооплачиваемой)

DDL FOR STORES

CREATE TABLE  "STORES" 
   (    "STORE_ID" NUMBER NOT NULL ENABLE, 
    "CITY" VARCHAR2(50), 
     PRIMARY KEY ("STORE_ID")
  USING INDEX  ENABLE
   )
/

DDL ДЛЯ СОТРУДНИКОВ

CREATE TABLE  "EMPLOYEES" 
   (    "EMPNO" NUMBER(4,0), 
    "ENAME" VARCHAR2(10), 
    "JOB" VARCHAR2(9), 
    "HIREDATE" DATE, 
    "SAL" NUMBER(7,2), 
    "COMM" NUMBER(7,2), 
    "STORE_ID" NUMBER
   )
/

CREATE INDEX  "EMP_NAME_IDEX" ON  "EMPLOYEES" ("ENAME")
/

CREATE INDEX  "EMP_NAME_JOB_DATE_IDX" ON  "EMPLOYEES" ("ENAME", "JOB", "HIREDATE")
/

Первый вопрос был о плохом синтаксисе SQL.Этот пытается найти наиболее высокооплачиваемого сотрудника в каждом магазине

Ответы [ 4 ]

0 голосов
/ 15 декабря 2018

Oracle имеет хорошие расширения для функций агрегирования group by, которые могут помочь:

select max(e.ename) keep (dense_rank first order by e.sal desc) as ename,
       max(e.job) keep (dense_rank first order by e.sal desc) as ejob,
       s.store_id,
       max(e.sal) as sal
       s.city
from employee e join
     stores s
     on e.store_id = s.store_id
group by s.store_id, s.city;
0 голосов
/ 15 декабря 2018

попробуйте, как показано ниже, используя подзапрос

select e.ENAME,t1.STORE_ID,t1.sal,s.CITY from (
 SELECT  MAX(e.SAL) sal,
 e.STORE_ID FROM EMPLOYEES e    
 GROUP BY e.STORE_ID
       ) t1 join EMPLOYEES e on t1.STORE_ID =e.STORE_ID  and e.sal=t1.sal
            join STORES  s on t1.STORE_ID =s.STORE_ID 
0 голосов
/ 15 декабря 2018

этот будет работать:

select * from (select e.ename,e.job,s.store_id,s.sal,s.city,
rank() over (partition by s.store_id order by s.sal desc) rnk 
from
employee e ,stores s
where e.store_id=s.store_id)
where rnk=1;
0 голосов
/ 15 декабря 2018

Вы можете использовать оконную функцию rank, чтобы ранжировать сотрудников по магазинам по их зарплате, а затем выбрать только верхнюю:

SELECT t.ename, t.job, t.sal, t.city
FROM   (SELECT e.ename, e.job, e.sal, s.city,
               RANK() OVER (PARTITION BY e.store_id ORDER BY s.sal DESC) AS rk
        FROM   employees e
        JOIN   stores s on e.store_id = s.store_id) t
WHERE  rk = 1
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...