我已經為此苦苦掙扎了很長一段時間,但仍然找不到合適的解決方案。我的情況是我在 SQL Server 2019 上有一個表,看起來像這樣,稱為 JOB:
| EMPLID | EMP_RCD | EFFDT | EFF_SEQ | HR_STATUS | 公司 |
|---|---|---|---|---|---|
| 102030 | 0 | 2013-02-04 | 0 | 積極的 | 100 |
| 102030 | 0 | 2013-02-04 | 1 | 積極的 | 100 |
| 102030 | 0 | 2013-05-28 | 0 | 積極的 | 100 |
| 102030 | 0 | 2013-05-28 | 1 | 不活躍 | 100 |
| 102030 | 1 | 2013-02-04 | 0 | 積極的 | 516 |
| 102030 | 1 | 2013-05-28 | 0 | 不活躍 | 516 |
| 102030 | 2 | 2013-05-28 | 0 | 積極的 | 100 |
| ... | ... | ... | ... | ... | ... |
我正在嘗試為每個 EMPLID 和 EMP_RCD 組合找到具有 MAX EFF_SEQ 值的 MAX EFFDT。例如 EMPLID 102030 和 EMP_RCD 0 應該給我 2013-05-28 的 MAX EFFDT 以及 EFF_SEQ 1 和 HR_STATUS Inactive。我的最終結果應該是這樣的:
| EMPLID | EMP_RCD | EFFDT | EFF_SEQ | HR_STATUS | 公司 |
|---|---|---|---|---|---|
| 102030 | 0 | 2013-05-28 | 1 | 不活躍 | 100 |
| 102030 | 1 | 2013-05-28 | 0 | 不活躍 | 516 |
| 102030 | 2 | 2020-01-01 | 0 | 積極的 | 516 |
| 102030 | 3 | 2013-09-16 | 0 | 不活躍 | 516 |
| 102030 | 4 | 2016-04-01 | 0 | 不活躍 | 516 |
| 102035 | 0 | 2020-08-18 | 0 | 積極的 | 100 |
| 102037 | 0 | 2020-01-01 | 0 | 積極的 | 100 |
| 102038 | 0 | 2020-01-01 | 0 | 不活躍 | 500 |
| 102038 | 1 | 2020-01-01 | 0 | 不活躍 | 500 |
在這里參考接受的答案,我嘗試像這樣運行我的查詢:
WITH JOBS AS (
SELECT A.EMPLID, A.EMP_RCD, A.EFFDT, A.EFF_SEQ, HR_STATUS
FROM JOB A
INNER JOIN
(SELECT EMPLID, EMP_RCD, MAX(EFFDT) AS MAX_EFFDT, MAX(EFF_SEQ) AS MAX_EFF_SEQ
FROM JOB
GROUP BY EMPLID, EMP_RCD) B
ON A.EMPLID = B.EMPLID
AND A.EMP_RCD = B.EMP_RCD
AND (A.EFFDT = B.MAX_EFFDT
OR A.EFF_SEQ = B.MAX_EFF_SEQ)
)
SELECT A.*, B.MAXEFFDT FROM JOB A
INNER JOIN (SELECT EMPLID, EMP_RCD, MAX(EFFDT) AS MAXEFFDT
FROM JOBS
GROUP BY EMPLID, EMP_RCD) AS B ON A.EMPLID=B.EMPLID AND A.EMP_RCD=B.EMP_RCD AND A.EFFDT=B.MAXEFFDT
ORDER BY A.EMPLID ASC, A.EMP_RCD ASC
但輸出看起來像這樣
| EMPLID | EMP_RCD | EFFDT | EFF_SEQ | HR_STATUS | 公司 |
|---|---|---|---|---|---|
| 102030 | 0 | 2013-05-28 | 0 | 積極的 | 100 |
| 102030 | 0 | 2013-05-28 | 1 | 不活躍 | 100 |
| 102030 | 1 | 2013-05-28 | 0 | 不活躍 | 516 |
| 102030 | 2 | 2020-01-01 | 0 | 積極的 | 516 |
| 102030 | 3 | 2013-09-16 | 0 | 不活躍 | 516 |
| 102030 | 4 | 2016-04-01 | 0 | 不活躍 | 516 |
| 102035 | 0 | 2020-08-18 | 0 | 積極的 | 100 |
| 102037 | 0 | 2020-01-01 | 0 | 積極的 | 100 |
| 102038 | 0 | 2020-01-01 | 0 | 不活躍 | 500 |
| 102038 | 1 | 2020-01-01 | 0 | 不活躍 | 500 |
結果表中的第一行不應該存在,其他一切都是正確的。我不確定為什么它會出現在那里。我嘗試了多種其他解決方案,但它總是導致第一行被列印,或者它甚至沒有接近預期的輸出。任何和所有的幫助將不勝感激。如果需要,我可以共享完整的表格,它太大了,無法在這里完整共享(雖然只有 65 行)。謝謝!
uj5u.com熱心網友回復:
select EMPLID
,EMP_RCD
,EFFDT
,EFF_SEQ
,HR_STATUS
,Company
from (
select *
,rank() over(partition by EMPLID, EMP_RCD order by EFFDT desc, EFF_SEQ desc) as rnk
from jobs
) jobs
where rnk = 1
| EMPLID | EMP_RCD | EFFDT | EFF_SEQ | HR_STATUS | 公司 |
|---|---|---|---|---|---|
| 102030 | 0 | 2013-05-28 | 1 | 不活躍 | 100 |
| 102030 | 1 | 2013-05-28 | 0 | 不活躍 | 516 |
| 102030 | 2 | 2013-05-28 | 0 | 積極的 | 100 |
小提琴
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/517361.html
標籤:sqlsql服务器tsqlsql-server-2019
上一篇:C# SQLServer:System.Data.SqlClient.SqlException:')'附近的語法不正確
