我在下面有一张员工表:
员工姓名 | 生效日期 | 字段类型 | 字段值 |
---|---|---|---|
特里 | 1/1/1991 | 标题 | 导师 |
特里 | 1/1/1991 | 部门 | LM |
特里 | 1/1/1992 | 标题 | 高级讲师 |
欧文 | 1/1/1990 | 标题 | 管理员 |
欧文 | 1/1/1990 | 部门 | LM |
我尝试了以下查询:
SELECT DISTINCT Employee.StaffName, NameWithMaxDate.MaxDate
FROM Employee
INNER JOIN
(SELECT StaffName,
MAX(EffectiveDate) OVER (PARTITION BY StaffName) AS MaxDate
FROM Employee) AS NameWithMaxDate
ON Employee.StaffName = NameWithMaxDate.StaffName
我得到以下结果:
员工姓名 | 最大日期 |
---|---|
欧文 | 1/1/1990 |
特里 | 1/1/1992 |
我还有一个问题:
SELECT StaffName,FieldValue
FROM Employee
WHERE FieldType = 'Department'
AND FieldValue = 'LM'
结果如下:
员工姓名 | 字段值 |
---|---|
特里 | LM |
欧文 | LM |
我有最后一个查询:
SELECT StaffName,FieldValue
FROM Employee
WHERE FieldType = 'Title'
这是我得到的结果:
员工姓名 | 字段值 |
---|---|
特里 | 导师 |
特里 | 高级讲师 |
欧文 | 管理员 |
我被困在如何组合上面的 3 个查询以获得我想要的结果,如下所示:
生效日期 | 员工姓名 | 标题 | 部门 |
---|---|---|---|
1/1/1992 | 特里 | 高级讲师 | LM |
1/1/1990 | 欧文 | 管理员 | LM |
也许我的 JOIN 概念还不够,或者在这种情况下我必须使用其他一些 SQL 函数吗?
谢谢
答案 0 :(得分:2)
诀窍是通过 StaffName
获取每个 FieldType
和 Effective Date
的最后一条记录。我们通过 WITH TIES
与窗口函数 row_number()
然后就变成了conditional aggregation
示例或dbFiddle
Select EffectiveDate=max(EffectiveDate)
,StaffName
,Title = max(case when FieldType='Title' then FieldValue end)
,Department = max(case when FieldType='Department' then FieldValue end)
From (
Select top 1 with ties *
From YourTable
Order By row_number() over (partition by StaffName,FieldType Order by EffectiveDate desc)
) A
Group By StaffName
结果
EffectiveDate StaffName Title Department
1990-01-01 Owen Administrator LM
1992-01-01 Terry Senior Instructor LM