【发布时间】:2021-06-09 16:23:06
【问题描述】:
我有一个类似这样的 EmployeeContract 表:
| ContractId | EmployeeId | ValidFrom | ValidTo | Salary |
|---|---|---|---|---|
| 12 | 5 | 2018-02-01 | 2019-06-31 | x |
| 25 | 8 | 2015-01-01 | 2099-12-31 | x |
| 50 | 5 | 2019-07-01 | 2021-05-31 | x |
| 52 | 6 | 2011-08-01 | 2021-12-31 | x |
| 72 | 8 | 2010-08-01 | 2014-12-31 | x |
| 52 | 6 | 2011-08-01 | 2021-12-31 | x |
表格包括公司中每位员工的历史合同。我需要知道员工开始工作的日期和合同的最后日期。有时记录有重复。
例如,根据上面的数据:
| EmployeeId | ValidFrom | ValidTo |
|---|---|---|
| 5 | 2018-02-01 | 2021-05-31 |
| 8 | 2010-08-01 | 2099-12-31 |
| 6 | 2011-08-01 | 2021-12-31 |
根据这篇文章:https://www.techcoil.com/blog/sql-statement-for-selecting-the-latest-record-in-each-group/
我准备了这样的查询:
select minv.*, maxv.maxvalidto from
(select distinct con.[EmployeeId], mvt.maxvalidto
from [EmployeeContract] con
join (select [EmployeeId], max(validto) as maxvalidto
FROM [EmployeeContract]
group by [EmployeeId]) mvt
on con.[EmployeeId] = mvt.[EmployeeId] and mvt.maxvalidto = con.validto) maxv
join
(select distinct con.[EmployeeId], mvf.minvalidfrom
from [EmployeeContract] con
join (select [EmployeeId], min(validfrom) as minvalidfrom
FROM [EmployeeContract]
group by [EmployeeId]) mvf
on con.[EmployeeId] = mvf.[EmployeeId] and mvf.minvalidfrom = con.validfrom) minv
on minv.[EmployeeId] = maxv.[EmployeeId]
order by 1
但我并不满意,我认为它不容易阅读,并且可能优化很差。我怎样才能做得更好?
【问题讨论】:
-
为什么不只是
MAX和MIN在这里工作?
标签: sql sql-server grouping