如何只获取每个部门最低工资员工的一条记录?数据库
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
) JOIN
s.
在解析函数中,PARTITION
从句用于表达GROUPING BY
条件。根据 salary
的升序 ORDER
,我们将通过 DENSE_RANK()
函数的结果中等于 1 的结果来过滤掉最小值。
使用这种方法,即使每个部门不止一个人,你也可以得到最低工资的所有员工。
此外,最好通过名称的第一个字符(或名称中包含的两个或三个字符,具体取决于第一个字母的常见字符)为表别名,以便限定查询中的列,而不是使用全名。
不需要在语句中使用DEPARTMENT
table
虽然使用 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;
我才刚刚接触数据库语言,所以我对 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
) JOIN
s.
在解析函数中,PARTITION
从句用于表达GROUPING BY
条件。根据 salary
的升序 ORDER
,我们将通过 DENSE_RANK()
函数的结果中等于 1 的结果来过滤掉最小值。
使用这种方法,即使每个部门不止一个人,你也可以得到最低工资的所有员工。
此外,最好通过名称的第一个字符(或名称中包含的两个或三个字符,具体取决于第一个字母的常见字符)为表别名,以便限定查询中的列,而不是使用全名。
不需要在语句中使用DEPARTMENT
table
虽然使用 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;