我有三個表,其中包含員工詳細資訊、休假詳細資訊和活動。
表 A
| 員工ID | 員工姓名 | 年齡 | 標題 |
|---|---|---|---|
| C001 | 薩曼莎于 | 32 | 審計師 |
| C002 | 加里·林 | 34 | 經理 |
| C003 | 湯姆肯尼迪 | 59 | 人力資源管理員 |
表 B
| 員工ID | 離開開始 | 離開結束 | 離開型別 |
|---|---|---|---|
| C001 | 12-07-2021 | 21-07-2021 | 醫療的 |
| C002 | 01-07-2021 | 03-07-2021 | 婚姻 |
| C002 | 21-08-2021 | 22-08-2021 | 年度的 |
| C002 | 15-10-2021 | 15-10-2021 | 年度的 |
| C003 | 2021 年 9 月 12 日 | 2021 年 11 月 12 日 | 婚姻 |
| C003 | 2021 年 11 月 12 日 | 13-12-2021 | 年度的 |
表 C
| 員工ID | 最新活動 | 活動日期 |
|---|---|---|
| C001 | 晉升 | 21-07-2021 |
| C002 | 晉升 | 07-03-2021 |
| C002 | 重組 | 15-09-2021 |
| C002 | 變更部門 | 24-11-2021 |
| C003 | 降級 | 2021 年 11 月 11 日 |
| C003 | 變更部門 | 15-11-2021 |
滿足以下輸出要求的 SQL 查詢是什么:
- 每個員工只有 LATEST LeaveDateStart、LeaveDateEnd 和 Date。
- 從輸出列中排除“降級”。
例如,上面的輸出將是:
| 員工ID | 員工姓名 | 標題 | 離開開始 | 離開結束 | 離開型別 | 日期 | 最新活動 |
|---|---|---|---|---|---|---|---|
| C001 | 薩曼莎于 | 審計師 | 12-07-2021 | 15-10-2021 | 年度的 | 21-07-2021 | 晉升 |
| C002 | 加里·林 | 經理 | 15-10-2021 | 15-10-2021 | 年度的 | 24-11-2021 | 變更部門 |
| C003 | 湯姆肯尼迪 | 人力資源管理員 | 2021 年 11 月 12 日 | 13-12-2021 | 年度的 | 15-11-2021 | 變更部門 |
正如您在上面看到的,Gary 有多個關于他的離開和活動的記錄,但在最終輸出中,我們只需要 LATEST LeaveStart、LATEST LeaveEnd、LATEST Activity 以及 ActivityDATE。
這是我嘗試過的查詢,但它仍然為每個用??戶回傳不同的 LeaveType 和 LatestActivity 的重復記錄。
SELECT DISTINCT
a.EMPLOYEEID,
a.EMPLOYEENAME,
a.TITLE,
MAX(b.LeaveStart) OVER(PARTITION BY a.EMPLOYEEID) as LeaveStart,
MAX(b.LeaveEnd) OVER(PARTITION BY a.EMPLOYEEID) as LeaveEnd,
MAX(c.Date) OVER(PARTITION BY a.EMPLOYEEID) as ActivtyDate,
b.LeaveType,
c.LatestActivity
FROM a
JOIN b
ON a.EMPLOYEEID = b.EMPLOYEEID
JOIN c
ON a.EMPLOYEEID = c.EMPLOYEEID
| 員工ID | 員工姓名 | 標題 | 離開開始 | 離開結束 | 離開型別 | 日期 | 最新活動 |
|---|---|---|---|---|---|---|---|
| C001 | 薩曼莎于 | 審計師 | 12-07-2021 | 15-10-2021 | 年度的 | 21-07-2021 | 晉升 |
| C002 | 加里·林 | 經理 | 15-10-2021 | 15-10-2021 | 年度的 | 24-11-2021 | 變更部門 |
| C002 | 加里·林 | 經理 | 21-08-2021 | 22-08-2021 | 年度的 | 15-09-2021 | 重組 |
| C002 | 加里·林 | 經理 | 01-07-2021 | 03-07-2021 | 婚姻 | 15-09-2021 | 重組 |
編輯:我在表命名中的錯誤
uj5u.com熱心網友回復:
您可以使用如下查詢,您可以在其中使用 row_number 獲取每個表的內部查詢中的最新資訊,并且不存在用于過濾掉
select
A.EmployeeID, A.EmployeeName, A.Title,
B.LeaveStart, B.LeaveEnd, B.LeaveType,
C.Date, C.LatestActivity
from TableA A
left join (
select *,
rn = row_number() over (partition by EmployeeID order by LeaveStart desc)
from TableB
) B
on B.EmployeeID=A.EmployeeID and B.rn=1
left join (
select *,
rn = row_number() over (partition by EmployeeID order by ActivityDate desc)
from TableC
) C
on C.EmployeeID=A.EmployeeID and C.rn=1
where not exists
(select 1 from TableC CC where CC.EmployeeID=A.EmployeeID and CC.LatestActivity='Demoted')
uj5u.com熱心網友回復:
您可以為此使用 LATERAL OUTER JOIN 查詢(??在 SQL Server 中稱為OUTER APPLY)。查詢的大致輪廓:
SELECT *
FROM employee
OUTER APPLY (
SELECT TOP 1 *
FROM leaves
WHERE EmployeeID = employee.EmployeeID
ORDER BY LeaveStart DESC
) AS oa1
OUTER APPLY (
SELECT TOP 1 *
FROM activity
WHERE EmployeeID = employee.EmployeeID AND LatestActivity <> 'Demoted'
ORDER BY ActivityDate DESC
) AS oa2
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/409826.html
標籤:
