sql - 使用 SQL MIN() 和 GROUP BY 的额外字段

标签 sql mysql aggregate-functions

当使用 SQL MIN() 函数以及 GROUP BY 时,任何其他列(不是 MIN 列或 GROUP BY 列之一)是否与匹配的 MIN 行中的数据匹配?

例如,给定一个包含部门名称、员工姓名和薪水的表:

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

显然,我会得到两个很好的列,最低工资和部门。员工姓名(以及任何其他员工字段)是否来自同一行?即带有 MIN(薪水)的行?

我知道很可能有两名员工的薪水相同(且最低),但我(现在)所关心的只是获取有关(或一个)的所有信息最便宜的员工。

这会选择最便宜的销售员吗?

SELECT min(salary), e.* FROM employee e WHERE department = 'sales'

基本上,我能否确定与 MIN() 函数一起返回的数据将匹配具有该最小值的(或单个)记录?

如果数据库很重要,我会使用 MySql。

最佳答案

如果您想在每个部门中获得“最便宜”的员工,您将有两个选择:

SELECT
     E.*     -- Don't actually use *, list out all of your columns
FROM
     Employees E
INNER JOIN
     (
          SELECT
               department,
               MIN(salary) AS min_salary
          FROM
               Employees
          GROUP BY
               department
     ) AS SQ ON
     SQ.department = E.department AND
     SQ.min_salary = E.salary

或者你可以使用:

SELECT
     E.*
FROM
     Employees E1
LEFT OUTER JOIN Employees E2 ON
     E2.department = E1.department AND
     E2.salary < E1.salary
WHERE
     E2.employee_id IS NULL -- You can use any NOT NULL column here

第二个语句的工作原理是,告诉我所有员工,你在同一部门找不到其他工资较低的员工。

在这两种情况下,如果两名或多名员工的最低工资相同,您将获得他们(全部)。

关于sql - 使用 SQL MIN() 和 GROUP BY 的额外字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/723054/

相关文章:

mysql - NodeJS+MySQL 而不是 PHP+MySQL。可以吗?

sql - sqlite的聚合函数

mysql - 从表中选择随机词

php - 使用 PHP MySQL 更新玩家分数

mysql - 数据对象存储 - 表 JOIN 可以连接到单表 SELECT 不能吗?

mysql - 是否可以在 Laravel 中的 String/varchar 类型列上的两个表之间创建外键关系?

aggregate-functions - 当代理群体在 Netlogo 中具有相同变量时停止该过程

sql - 对于 A 列中的每个不同值,在一行中返回 B 列的所有不同值

sql - Last_value 分区依据

sql - JDBC 规范是否阻止将 '?' 用作运算符(引号外)?