sql - 按最旧时间排序的列表行
问题描述
我对 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)
解决方案
如果你想使用第一个值,它看起来像这样,注意我没有在 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
推荐阅读
- excel - 循环通过宏调用的 Excel 2013 宏仅适用于一张工作表
- sql - Hadoop SQL - Impala 和计算字段
- reactjs - React-Table 从状态打开子组件
- reactjs - 如何使用 TypeScript 正确键入 React 连接的组件
- php - Ajax Zip 文件下载 - WordPress Guru
- excel - 构建一个直到循环以循环一列直到空单元格
- javascript - 是否可以存根函数以外的东西?
- python - FutureWarning:pandas.tslib 已弃用,将在未来版本中删除
- java - JVM 进程内存使用与 Yourkit 分析器不匹配
- asp.net-core - 带有 Swagger 的版本化 API 未检测 API 操作