首页 > 解决方案 > 按最旧时间排序的列表行

问题描述

我对 sql 有点陌生,我遇到了从三个表中获取特定信息的问题。我有那三张桌子。

员工表

在此处输入图像描述

公司表

在此处输入图像描述

就业表

在此处输入图像描述

就业中的 EmployeeID 是 FK CompanyID 在公司中是 FK Emplyment 中的就业 ID 是 PK NULL 在就业中的就业结束日期意味着工人目前在那里工作。

我一直在尝试这个但没有工作

select Company.CompanyName as CompanyName , CONCAT( Employee.FirstName, ' ' ,Employee.LastName) as EmployeeName , Employment.EmploymentStartDate from Employment LEFT JOIN Employee on Employee.EmployeeID = Employment.EmployeeID 
LEFT JOIN Company on Company.CompanyID = Employment.CompanyID 
where Employment.EmploymentEndDate is null 
and EXISTS(SELECT Employment.CompanyID, MAX(DATEDIFF( DAY,Employment.EmploymentStartDate ,GETDATE())) as MaxDate FROM  Employment where  Employment.EmploymentEndDate is null group by CompanyID)

并给了我这个结果:

在此处输入图像描述

这是错误的,因为来自“Steve's Widgets Inc”公司,我只希望 John Doe 是最老的工人。

这正是我想要的,列出所有公司,并给出目前在公司工作时间最长的员工的姓名和开始日期。(预期列:CompanyName、EmployeeName、EmploymentStartDate)

标签: sqlsql-servertsql

解决方案


如果你想使用第一个值,它看起来像这样,注意我没有在 sql server 上使用过第一个值(仅在 db2 上),我没有测试这个,因为我手头没有 sql server。

SELECT DISTINCT
  Company.CompanyName, 
  CONCAT(Employee.FirstName, ' ', Employee.LastName) AS EmployeeName,
  FIRST_VALUE(Employment.EmploymentStartDate) 
    OVER (PARTITION BY Company.CompanyName, CONCAT(Employee.FirstName, ' ', Employee.LastName) 
      ORDER BY Employment.EmploymentStartDate ASC 
      RANGE BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING
    ) AS StartDate
FROM Employment 
JOIN Company ON Employment.CompanyID = Company.CompanyID
JOIN Employee ON Employment.EmployeeID = Employee.EmployeeID
WHERE Employment.EmploymentEndDate IS NULL

推荐阅读