【问题标题】:SQL Query to select employee from each departmentSQL 查询从每个部门中选择员工
【发布时间】:2019-07-16 04:30:30
【问题描述】:

我正在尝试查询一个查询以选择每个部门中最年长的员工。我能够加入所有表格,并获得我想要的列。我不仅需要选择每个部门最早的开始日期。如果两个员工的开始日期相同,也列出他们。

我尝试从就业历史表中执行一个子查询,说员工 ID 是 IN MIN(s.startDate)。这抓住了所有的 MIN

这是我最重要的选择语句:

SELECT 
    e.FirstName, e.LastName, MIN(edh.StartDate), department.Name
FROM.....

这是使用AdventureWorks 示例数据库:

https://moidulhassan.files.wordpress.com/2014/07/adventureworks2008_schema.gif

【问题讨论】:

  • 帮助我们帮助您并分享您的表格结构。另外,请使用您正在使用的rdbms 标记您的问题
  • 由于 AdventureWorks 假设它是 SQLS

标签: sql sql-server


【解决方案1】:

您可以按年龄递减rank员工,并从每个部门中抽取第一个:

SELECT FirstName, LastName, BirthDate, DepatmetnName
FROM   (SELECT p.FirstName AS FirstName, 
               p.LastName AS LastName,
               e.BirthDate AS BirthDate,
               d.Name AS DepartmentName,
               RANK() OVER (PARTITION BY d.DepartmentID ORDER BY e.BirthDate DESC) AS rk
        FROM   Person p
        JOIN   Employee e ON p.BusinessEntityID = e.BusinessEntityID
        JOIN   EmployeeDepartmentHistory edh ON e.BusinessEntityID = edh.BusinessEntityID AND
                                                edh.EndDate IS NULL
        JOIN   Department d ON edh.DepartmentID = d.DerpartmentID) t
WHERE  rk = 1

【讨论】:

    【解决方案2】:

    假设您使用的是相对较新的 sql server:

    SELECT * FROM
    (
      SELECT *, ROW_NUMBER() OVER(PARTITION BY department.name ORDER BY edh.startdate) rown 
      FROM ...
    ) x
    WHERE x.rown = 1
    

    行号分析将创建一个递增的数字列,1 是最早的开始日期和顺序。分区使每个部门的行编号从 1 开始。然后我们只选择所有编号为 1 的行。如果您想要联系(两个人都在相同的最早日期开始),请使用 RANK 而不是 ROW_NUMBER。如果您想根据某些标准(字母名字)排除平局,请按顺序将其包括在内,这样 Alice 总是得到 1 而不是 Bob

    如果你的sql server太老了,不支持row_number,那就升级吧。您还可以使用该查询找到每个部门(您拥有的那个)的最小开始日期并将其设为子查询,将其剥离为返回部门 id 和开始日期所需的内容,并将其加入回主要查询:

    SELECT * FROM
    (
      SELECT departmentid, MIN(startdate) as mindate FROM ... ) x
    INNER JOIN
    ...
    ON ...departmentid = x.departmentid AND ...startdate = x.mindate
    

    【讨论】:

    • 我以前从未见过这种情况
    • 小知识:我相信甲骨文在 1998 年左右在 8i 版中引入了 row_number。MS 花了几年的时间才赶上,但也有一段时间了。非常有用 - 阅读“sql server windowing functions”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-11
    • 1970-01-01
    • 2021-08-22
    • 1970-01-01
    • 2013-03-22
    • 2010-11-06
    • 1970-01-01
    相关资源
    最近更新 更多