sql-server 查找每种两列组合的MAX值

xam8gpfp  于 2022-10-31  发布在  其他
关注(0)|答案(1)|浏览(142)

我已经为此纠结了很长一段时间,但仍然找不到合适的解决方案。我的情况是,我在SQL Server 2019上有一个表,它看起来像这样,名为JOB:
| 空|EMP_剩余电流保护装置|有效时间|有效性序列|人力资源状态|公司名称|
| - -|- -|- -|- -|- -|- -|
| 小行星10|第0页|2013年2月4日|第0页|活动的|100个|
| 小行星10|第0页|2013年2月4日|一个|活动的|100个|
| 小行星10|第0页|2013年5月28日|第0页|活动的|100个|
| 小行星10|第0页|2013年5月28日|一个|不活动|100个|
| 小行星10|一个|2013年2月4日|第0页|活动的|五百一十六|
| 小行星10|一个|2013年5月28日|第0页|不活动|五百一十六|
| 小行星10| 2个|2013年5月28日|第0页|活动的|100个|
| 一个人。|一个人。|一个人。|一个人。|一个人。|一个人。|
我正在尝试查找每个EMPLID和EMP_RCD组合的最大EFF_SEQ值的最大有效时间。例如,EMPLID 102030和EMP_RCD 0应给予2013-05-28的最大有效时间,以及EFF_SEQ 1和HR_STATUS无效。最终结果应如下所示:
| 空|EMP_剩余电流保护装置|有效时间|有效性序列|人力资源状态|公司名称|
| - -|- -|- -|- -|- -|- -|
| 小行星10|第0页|2013年5月28日|一个|不活动|100个|
| 小行星10|一个|2013年5月28日|第0页|不活动|五百一十六|
| 小行星10| 2个|2020年1月1日|第0页|活动的|五百一十六|
| 小行星10|三个|2013年9月16日|第0页|不活动|五百一十六|
| 小行星10|四个|2016年4月1日|第0页|不活动|五百一十六|
| 小行星102035|第0页|2020年8月18日|第0页|活动的|100个|
| 小行星102037|第0页|2020年1月1日|第0页|活动的|100个|
| 小行星102038|第0页|2020年1月1日|第0页|不活动|500个|
| 小行星102038|一个|2020年1月1日|第0页|不活动|500个|
参考已接受的答案here,我已尝试按如下方式运行查询:

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

但输出如下所示
| 空|EMP_剩余电流保护装置|有效时间|有效性序列|人力资源状态|公司名称|
| - -|- -|- -|- -|- -|- -|
| 小行星10|第0页|2013年5月28日|第0页|活动的|100个|
| 小行星10|第0页|2013年5月28日|一个|不活动|100个|
| 小行星10|一个|2013年5月28日|第0页|不活动|五百一十六|
| 小行星10| 2个|2020年1月1日|第0页|活动的|五百一十六|
| 小行星10|三个|2013年9月16日|第0页|不活动|五百一十六|
| 小行星10|四个|2016年4月1日|第0页|不活动|五百一十六|
| 小行星102035|第0页|2020年8月18日|第0页|活动的|100个|
| 小行星102037|第0页|2020年1月1日|第0页|活动的|100个|
| 小行星102038|第0页|2020年1月1日|第0页|不活动|500个|
| 小行星102038|一个|2020年1月1日|第0页|不活动|500个|
结果表中的第一行不应该存在,其他所有内容都是正确的。我不确定我遗漏了什么,为什么它会出现在那里。我尝试了多种其他解决方案,但总是导致第一行被打印出来,或者它甚至没有接近预期的输出。任何和所有的帮助将不胜感激。如果需要,我可以共享完整的表,它太大了,无法在这里全部共享(虽然只有65行)。谢谢!

xu3bshqb

xu3bshqb1#

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

| 空|EMP_剩余电流保护装置|有效时间|有效性序列|人力资源状态|公司名称|
| - -|- -|- -|- -|- -|- -|
| 小行星10|第0页|2013年5月28日|一个|不活动|100个|
| 小行星10|一个|2013年5月28日|第0页|不活动|五百一十六|
| 小行星10| 2个|2013年5月28日|第0页|活动的|100个|
Fiddle

相关问题