我想检索每个人获得的最新2度学位。原始表存储如下信息:

personnel_num | certificate_txt | degree_date
------------------------------------------------------
10000   Bachelor Degree - Science   1979-06-06
10000   Master Degree - Business    1982-12-31
10001   Bachelor Degree - Arts      1991-05-01
10001   Master Degree - Business    1995-12-01
10001   Bachelor Degree - Science   1974-06-01
10002   Master Degree - Arts        1981-03-01
10003   Doctor Of Law               1978-05-01
10003   Master Degree - Science     1981-05-01
10006   Bachelor Degree - Science   1996-06-01
10006   Master Degree - Business    2004-05-01
10007   Bachelor Degree - Business  2002-05-01


我尝试使用以下脚本:

select tb1.personnel_num, tb1.certificate_txt, tb1.degree_date
from education tb1
left join education tb2
on tb1.personnel_num = tb2.personnel_num
and tb1.degree_date > tb2.degree_date
group by personnel_num
having count(*) <= 2
order by personnel_num;


我遇到了两个问题:
结果使我获得了每个人的最新学位,而不是最新的2个学位。
2.原始表中超过2度的任何人都不会被退回。我认为这与having count(*) <=2有关,但是应该控制返回的结果而不是原始表。

知道我做错了什么吗?

谢谢,

最佳答案

这个概念是错误的。


GROUP BY personnel_num确保每个person_num最多具有1条结果记录。在该记录中,您只选择1个日期,因此您可能无法期望每个人获得2个日期。
HAVING COUNT(*)<=2说,仅考虑那些最多包含2条记录的组。但是您进行了连接(所有行到所有行),其中较新的旧对有效。如果您有4个记录的值分别为2007、2008、2009、2010,则合并结果中的对(tb1.degree_date到tb2.degree_date)将为:2010-2009、2010-2008、2010-2007、2009-2008, 2009-2007、2008-2007;多数民众赞成在6条记录(远远超过2条)。
因此,要纠正上述两种情况,我们需要1.选择两个日期,以及2.将它们汇总到各自的最大值并删除HAVING。

SELECT tb1.personnel_num, MAX(tb1.degree_date), MAX(tb2.degree_date)
FROM education tb1
LEFT JOIN education tb2
ON tb1.personnel_num = tb2.personnel_num AND tb1.degree_date > tb2.degree_date
GROUP BY personnel_num
ORDER BY personnel_num;



提示:为您的原始SQL问题提供一个SQLfiddle,这样您将可能更快地获得更准确的答案。

10-04 10:56