0

为简化起见,如果我有一个名为“员工”的表:

id INT NOT NULL PRIMARY KEY,
salary FLOAT,
department VARCHAR(255)

我想执行和查询我在哪里检索每个部门的最低工资。所以我的查询是这样的:

SELECT employee.ID, MIN(employee.salary), employee.department
FROM employee
GROUP BY employee.department

但无论找到哪些记录。结果集中的 ID 值被重命名为 1,2,3.... 直到结果集中存在许多记录(部门)。

执行 AGGREGATE 功能后如何维护员工的实际 ID 和GROUP BY

4

5 回答 5

4

你不能。想一想,如果一个部门有 20 名员工,并且该部门有 3 名员工的最低工资相同,那么您希望查询输出显示哪个 EmployeeId?如果保证每个部门只有一名员工的工资最低,那么可以通过选择工资是每个部门最小值的特定员工记录来完成:

Select EmployeeID
From Employee e
Where Salary = 
      (Select Min(Salary) From EMployee
       Where DepartmentId = e.DepartmentId)

但是当超过一名员工的最低工资水平时,这将返回每个部门的多条记录。

于 2010-01-20T00:21:27.147 回答
2

我猜您使用的是 MySQL 或 SQLite,因为您的查询是模棱两可的,并且标准 SQL 或大多数品牌的 RDBMS 都不允许。MySQL 和 SQLite 更宽松,因此您有责任解决歧义。

这是我通常的解决方法:

SELECT e1.ID, e1.salary, e1.department
FROM employee e1
LEFT OUTER JOIN employee e2 ON (e1.department = e2.department
    AND e1.salary > e2.salary)
WHERE e2.department IS NULL;

这是另一个给出相同结果的解决方案:

SELECT e1.ID, e1.salary, e1.department
FROM employee e1
JOIN (SELECT e2.department, MIN(e2.salary) AS min_salary
      FROM employee e2 GROUP BY e2.department) d
  ON (e1.salary = d.min_salary);

如果部门中有多名员工具有相同的最低工资,则这两种方法都会为每个部门提供多行。您需要决定如何解决这种情况,因为从您的问题描述中并不清楚。

于 2010-01-20T01:38:10.573 回答
1

这可以解决问题:

SELECT employee.department, MIN(employee.salary), employee.ID
FROM employee
GROUP BY 1
于 2010-01-20T00:17:24.710 回答
1

您的脚本无效:

SELECT employee.ID, MIN(employee.salary), employee.department
FROM employee
GROUP BY employee.department

相反,看看这个:

SELECT MIN(employee.salary), employee.department
FROM employee
GROUP BY employee.department

如果您还需要员工 ID,则需要使用子查询。

于 2010-01-20T00:18:53.673 回答
0

在现代 SQL Server 版本(以及其他相当强大的现代 SQL 引擎)中,SQL“窗口函数”可能是执行您想要的最佳选择(优于子查询和自联接):

  SELECT ID, salary, department
  FROM employee
  WHERE 1 = ROW_NUMBER() OVER(PARTITION BY department ORDER BY salary ASC)

这适用于,如果多个员工的薪水相同(部门最低),您只需要其中一个“随机”(ORDER BY如果您希望某个特定标准选择一个,您可以添加标准);如果您想要全部,请查看RANK,而不是。ROW_NUMBER

于 2010-01-20T00:25:39.323 回答