当使用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

第二条语句的工作方式是有效的话,告诉我所有的员工,你不能在同一个部门以较低的薪水找到另一名雇员。

在这两种情况下,如果两个或更多的员工有平等的工资是最低,你会得到他们两个(全部)。

其他提示

SELECT  e.*
FROM    employee e
WHERE   e.id =
        (
        SELECT  id
        FROM    employee ei
        WHERE   ei.department = 'sales'
        ORDER BY
                e.salary
        LIMIT 1
        )

要为每个部门得到的值,使用:

SELECT  e.*
FROM    department d
LEFT JOIN
        employee e
ON   e.id =
        (
        SELECT  id
        FROM    employee ei
        WHERE   ei.department = d.id
        ORDER BY
                e.salary
        LIMIT 1
        )

要只对那些有雇员的部门获取值,使用:

SELECT  e.*
FROM    (
        SELECT  DISTINCT eo.department
        FROM    employee eo
        ) d
JOIN
        employee e
ON   e.id =
        (
        SELECT  id
        FROM    employee ei
        WHERE   ei.department = d.department
        ORDER BY
                e.salary
        LIMIT 1
        )

当然,具有上(department, salary)索引将大大提高所有三个查询。

最快溶液:

SET @dep := '';
SELECT * FROM (
  SELECT * FROM `employee` ORDER BY `department`, `salary`
) AS t WHERE IF ( @dep = t.`department`, FALSE, ( @dep := t.`department` ) OR TRUE );

另一种方法可以是使用分析函数。下面是使用的分析和功能ROW_NUM查询

SELECT名字,薪水从(SELECT名字,薪水,ROW_NUMBER()以上(PARTITION BY DEPARTMENT_ID ORDER BY薪金ASC)从员工ROW_COUNT)其中ROW_COUNT = 1;

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top