SQL 连接 3 个不同的查询

时间:2021-05-26 14:52:41

标签: sql sql-server

我在下面有一张员工表:

<头>
员工姓名 生效日期 字段类型 字段值
特里 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 函数吗?

谢谢

1 个答案:

答案 0 :(得分:2)

诀窍是通过 StaffName 获取每个 FieldTypeEffective 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