【问题标题】:T-SQL get values for specific groupT-SQL 获取特定组的值
【发布时间】: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

但我并不满意,我认为它不容易阅读,并且可能优化很差。我怎样才能做得更好?

【问题讨论】:

  • 为什么不只是 MAXMIN 在这里工作?

标签: sql sql-server grouping


【解决方案1】:

我想你想要group by:

select employeeid, min(validfrom), max(validto)
from employeecontract
group by employeeid

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-08-17
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多