【问题标题】:List rows order by oldest time列出行按最早时间排序
【发布时间】:2019-05-31 12:54:26
【问题描述】:

我对sql有点新,我有这个问题要从三个表中获取特定信息。我有这三张桌子。

员工表

公司表

就业表

就业中的 EmployeeID 是 FK Company 中的 CompanyID 为 FK Employment中的EmploymentID是PK EmploymentEndDate 中的 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)

【问题讨论】:

  • 您要解决的问题有点不清楚。请编辑以使问题更直接。另外,请格式化 SQL 代码,使其更具可读性。
  • @EricWu 这就是我想要的,列出所有公司,并给出目前在该公司工作时间最长的员工的姓名和开始日期。 (预期列:CompanyName、EmployeeName、EmploymentStartDate)
  • “最老”和“在公司工作最久”之间存在冲突。您对最大年龄或最小雇用日期感兴趣吗?以可消费的形式提供 DDL 和示例数据也很有帮助,而不仅仅是数据图片。不使用图片的原因是here

标签: sql sql-server tsql


【解决方案1】:
with oldest (companyId, empStart) as 
(
select companyId, min(EmploymentStartDate) 
from Employment
where EmploymentEndDate is null
group by companyId
)
select c.CompanyName, e.Firstname + ' ' + e.LastName as employeeName, em.employmentStartDate
from Employment em
inner join oldest o on em.CompanyId = o.CompanyID and em.employmentStartDate = o.empStart
inner join employee e on em.EmployeeId = e.EmployeeId
inner join company c on em.CompanyId = c.CompanyId;

【讨论】:

    【解决方案2】:

    如果你想使用第一个值,它看起来像这样,注意我没有在 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-09-15
      • 2016-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-18
      相关资源
      最近更新 更多