首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >执行MIN然后GROUP BY后,ID值丢失。为什么?

问执行MIN然后GROUP BY后,ID值丢失。为什么?
EN

Stack Overflow用户
提问于 2010-01-20 08:14:04
回答 5查看 2.2K关注 0票数 0

为了简单起见,如果我有一个名为‘employee’的表:

代码语言:javascript
复制
id INT NOT NULL PRIMARY KEY,
salary FLOAT,
department VARCHAR(255)

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

代码语言:javascript
复制
SELECT employee.ID, MIN(employee.salary), employee.department
FROM employee
GROUP BY employee.department

但是不管找到了哪些记录。结果集中的ID值被重命名为1,2,3...结果集中最多存在多少条记录(部门)。

在执行聚合函数和GROUP BY后,如何维护员工的实际ID

EN

回答 5

Stack Overflow用户

发布于 2010-01-20 08:21:27

想一想,如果一个部门有20名员工,而该部门有3名员工的最低工资相同,那么您希望查询输出显示哪个EmployeeId?如果保证每个部门中只有一名员工具有最低工资,则可以通过选择特定员工记录来实现,其中工资是每个部门的最小值:

代码语言:javascript
复制
Select EmployeeID
From Employee e
Where Salary = 
      (Select Min(Salary) From EMployee
       Where DepartmentId = e.DepartmentId)

但是,当多个员工具有该最低工资水平时,这将为每个部门返回多条记录。

票数 4
EN

Stack Overflow用户

发布于 2010-01-20 09:38:11

我猜您使用的是MySQL或SQLite,因为您的查询是不明确的,标准SQL或大多数品牌的RDBMS都不允许这样做。MySQL和SQLite更为宽松,因此您有责任解决歧义问题。

这是我通常的解决方法:

代码语言:javascript
复制
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;

下面是另一个解决方案,它给出了相同的结果:

代码语言:javascript
复制
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);

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

票数 2
EN

Stack Overflow用户

发布于 2010-01-20 08:17:25

这将会起到作用:

代码语言:javascript
复制
SELECT employee.department, MIN(employee.salary), employee.ID
FROM employee
GROUP BY 1
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2098186

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档