很难创建mysql查询来执行以下操作。
我们有一个列表的工作人员列表如下:
eg: employee table
name em_date (other cols)
Fred 1-1-1960
Fred 1-1-1970
Fred 1-1-1980
John 1-1-1960
John 1-1-1990
我们有第二个包含家庭详细信息的表:
Partners table
name marriage_date partner_name (other cols)
Fred 1-1-1959 Sue
Fred 1-1-1969 Marg
John 1-1-1985 Joan
我正在尝试生成一个包含以下内容的表: name,employment_date,marriage_date,partner_name
有些员工多次受雇(想想承包商),所以他们有多个就业日期。他们中的一些人也再婚,所以在不同的时间有不同的伴侣(和/或可能在某个时候没有结婚)
我需要输出结果才能显示合作伙伴。
输出应为:
name em_date mar_date partner_name
Fred 1-1-1960 1-1-1959 Sue
Fred 1-1-1970 1-1-1969 Marg
Fred 1-1-1980 1-1-1969 Marg
John 1-1-1960 null null
John 1-1-1990 1-1-1985 Joan
我确信我可以使用下面链接中的SQL,但是我无法解决它 https://dba.stackexchange.com/questions/27823/query-to-find-closest-lesser-date
任何指针都非常感激 - 我会包括我尝试过但我已经尝试过多而且它只是不起作用。我要么得到笛卡尔积,要么得一排。
名称上有关键字和2个日期,但没有其他关键字(即:在雇用时没有将员工与其合作伙伴联系起来的ID [认为事后导入旧数据...])我必须按名称搜索并根据计算匹配最近的合作伙伴:
min(employment_date - marriage date)
非常感谢提前。
编辑:员工表的主键是组合名称,雇用日期。合作伙伴表的PK是组合名称,结婚日期。如果我可以改变它,我会....
因为我是新用户而无法编辑而无法编辑......
编辑:sqlfiddle: http://sqlfiddle.com/#!2/84148/2
答案 0 :(得分:0)
令人惊讶的是,我能够偶然发现与我的问题类似的东西,以至于我能够解决它。感谢所有贡献者。
以下是我找到的解决方案:
select t2.emp_name, t2.start_date, t1.spouse_name, t1.mar_yr
from
( select t2.emp_name, t2.start_date,
( select max(mar_yr)
from partners t1
where t1.emp_name = t2.emp_name
and t1.mar_yr <= year(t2.start_date)
) as mar_yr
from employees t2) t2
left outer join
partners t1 on t2.emp_name = t1.emp_name and t2.mar_yr = t1.mar_yr;
SQLFiddle在这里:http://sqlfiddle.com/#!2/84148/13
它正是我所需要的。感谢所有为早些时候找不到解决方案做出贡献的人,以及顺便提一下,在这里: MySQL - Selecting the latest records before a given date in a JOIN