Как получить только одну запись для минимальной заработной платы работника из каждого отдела? DB2 - PullRequest
1 голос
/ 22 февраля 2020

Я только начал работать с языками баз данных, поэтому ничего не знаю о JOIN, PARTITION, ET C. но это то, что у меня есть.

То, что я пробовал:

SELECT MIN(SALARY) AS "MIN SALARY", WORKING.DID, ENAME
  FROM DEPARTMENT, EMPLOYEE, WORKING
 WHERE WORKING.EID = EMPLOYEE.EID
 GROUP BY WORKING.DID, ENAME;
Result:
 MIN SALARY DID ENAME
 ---------- --- ------
      10000 101 Dustin
      15000 102 Bob
      20000 102 David
      10000 102 Dustin
      10000 103 Alex
       8000 103 Alice
       7000 103 Mike

Что я хочу:

 MIN SALARY DID ENAME
 ---------- --- ------
      10000 101 Dustin
      10000 102 Dustin
       7000 103 Mike

Структуры таблиц:

CREATE TABLE EMPLOYEE (
    EID INTEGER NOT NULL,
    ENAME VARCHAR(25),
    SALARY DECIMAL,
    PRIMARY KEY (EID)
);

CREATE TABLE WORKING (
    EID INTEGER NOT NULL,
    DID INTEGER NOT NULL,
    STIME DATE,
    FOREIGN KEY (EID) REFERENCES EMPLOYEE (EID),
    FOREIGN KEY (DID) REFERENCES DEPARTMENT (DID),
    PRIMARY KEY (EID, DID)
);

CREATE TABLE DEPARTMENT (
    DID INTEGER NOT NULL,
    DNAME VARCHAR(10),
    DADDRESS VARCHAR(20),
    PRIMARY KEY (DID)
);

Диаграмма ER

Ответы [ 2 ]

2 голосов
/ 23 февраля 2020

Вы можете использовать онлайн-аналитические функции обработки (OLAP), такие как DENSE_RANK(), чтобы легко получить желаемый результат

SELECT Q.SALARY, Q.DID, Q.ENAME 
  FROM
  (
   SELECT E.SALARY, W.DID, E.ENAME,
          DENSE_RANK() OVER (PARTITION BY W.DID ORDER BY E.SALARY) AS DR
     FROM WORKING W
     JOIN DEPARTMENT D
       ON D.DID = W.EID
     JOIN EMPLOYEE E
       ON E.EID = W.EID
   ) Q
  WHERE DR = 1

, в котором явный синтаксис JOIN, синтаксис с разделением запятыми таблицы считаются устаревшими, используются. Использование (INNER) JOIN достаточно для вашего случая, в то время как могут быть случаи, требующие OUTER (LEFT - RIGHT или FULL) JOIN с.

В пределах функция analyti c, пункт PARTITION используется для express criteira GROUPING BY. Основываясь на возрастающем ORDER для salary, мы получим минимальные, которые будут отфильтрованы по результатам, поступающим из функции DENSE_RANK() со значениями, равными единице.

Используя этот метод вы можете получить всех сотрудников с минимальной заработной платой, даже если в каждом отделе работают несколько человек.

Более того, лучше псевдоним таблиц по имени первого имени (или двум или трем символам, содержащимся в их имена в зависимости от общих символов (для первых букв), чтобы квалифицировать столбцы в запросе, а не использовать целые имена.

0 голосов
/ 23 февраля 2020

Нет необходимости использовать таблицу DEPARTMENT в операторе.
Хотя использование функций OLAP является предпочтительным способом и, как правило, обеспечивает лучшую производительность, существует другой метод, не использующий функции OLAP, основанный на присоединении базовых таблиц к подпрограмме. -выбрать с групповым результатом, где мы получаем отдел минимальной заработной платы. Мы возвращаемся к минимумам этих отделов до WORKING & EMPLOYEE подбор сотрудников только с минимальной зарплатой отдела.

SELECT G.DID, G.SALARY, E.ENAME
FROM
(
SELECT W.DID, MIN(E.SALARY) SALARY
FROM WORKING W
JOIN EMPLOYEE E ON E.EID = W.EID
GROUP BY W.DID
) G
JOIN WORKING  W ON W.DID = G.DID
JOIN EMPLOYEE E ON E.EID = W.EID AND E.SALARY = G.SALARY;
...