gpt4 book ai didi

mysql - 如何使用mysql中的自连接返回最新的2个日期

转载 作者:行者123 更新时间:2023-11-30 00:18:25 24 4
gpt4 key购买 nike

我想检索每个人获得的最新 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;

我遇到了两个问题:1.结果给我的是每个人拥有的最新学位,而不是最新的2个学位。2. 凡在原表中获得2度以上的,不予退还。我认为这与having count(*) <=2有关但这应该控制返回的结果而不是原始表。

知道我做错了什么吗?

谢谢

最佳答案

这个概念是错误的。

  1. GROUP BY personnel_num确保每个 person_num 最多有 1 个结果记录。在该记录中,您仅选择 1 个日期,因此您不可能期望每个人员获得 2 个日期。
  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 条)。
  3. 因此,要纠正上述两个问题,我们需要 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,这样您可能会更快地获得更准确的答案。

关于mysql - 如何使用mysql中的自连接返回最新的2个日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23462190/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com