如何只获取每个部门最低工资员工的一条记录?数据库

How to get only one record for the minimum wage employee from each department? DB2

我才刚刚接触数据库语言,所以我对 JOIN、PARTITION 等一无所知。但这就是我目前所拥有的。

我尝试了什么:

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

Table 结构:

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 Diagram

您可以更喜欢使用DENSE_RANK()等在线分析处理(OLAP)功能来轻松获得想要的结果

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 or FULL) JOINs.

在解析函数中,PARTITION 从句用于表达GROUPING BY 条件。根据 salary 的升序 ORDER,我们将通过 DENSE_RANK() 函数的结果中等于 1 的结果来过滤掉最小值。

使用这种方法,即使每个部门不止一个人,你也可以得到最低工资的所有员工。

此外,最好通过名称的第一个字符(或名称中包含的两个或三个字符,具体取决于第一个字母的常见字符)为表别名,以便限定查询中的列,而不是使用全名。

不需要在语句中使用DEPARTMENTtable
虽然使用 OLAP 函数是更可取的方法并且通常可以提供更好的性能,但还有另一种不使用 OLAP 函数的方法,该方法基于将基数 tables 重新加入到具有分组结果的子 select,我们获得部门最低工资.我们将这些部门最低工资重新加入到 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;