我们有两个表person
,用于存储有关某个人的信息,dates
用于存储与某个人相关的日期。
在人员表中,我们关注的信息是
psref clock prev
1 80
2 90
3 100 80
4 101 90
psref
是表格中的唯一参考。 clock
是当前的工资单编号。 prev
表示此人曾在不同的工资单号下工作。
日期表存储与每个人相关的日期。
dtref person date event
1 1 2010-01-01 1 (start)
2 1 2010-02-01 2 (leaving)
3 2 2010-01-01 1
4 2 2010-02-01 2
5 3 2010-02-02 1
6 4 2011-01-01 1
根据以上数据,您可以看到返回的人有两种情况。
情景A 1号人员在2010-02-01离开了公司,并在第二天给出了一份新的合同,新的时钟号。
情景B 人员2在2010-02-01离开公司,一年后返回,2011-01-01
我可以使用下面的查询将每个psref的开始和结束日期作为单行获取:
SELECT clock, prev, a.date AS StartDate, b.date AS LeavingDate
FROM person
LEFT OUTER JOIN dates a ON (psref = a.person AND a.event = 1)
LEFT OUTER JOIN dates b ON (psref = b.person AND b.event = 2)
我需要做的只是报告一行,其中prev
离开日期是当前开始日期前1天的人。
链条不一定只有1层深(不要问!)
答案 0 :(得分:1)
这应该为您提供当前作业在上一个作业后一天开始的所有条目(假设clock
和prev
是唯一值):
SELECT *
FROM person tp
JOIN dates tdt
ON (tp.psref = tdt.person AND tdt.event = 1)
join person lp
on tp.clock = lp.clock
JOIN dates ldt
ON (lp.psref = ldt.person AND ldt.event = 2)
and DATEDIFF(tdt.date, ldt.date) = 1;
如果按“当前”表示当前作业没有结束日期,您也可以检查:
SELECT *
FROM person tp
JOIN dates tdt
ON (tp.psref = tdt.person AND tdt.event = 1)
join person lp
on tp.clock = lp.clock
JOIN dates ldt
ON (lp.psref = ldt.person AND ldt.event = 2)
and datediff(tdt.date, ldt.date) = 1
left join dates tdtend ON (tp.psref = tdt.person AND tdt.event = 2)
where tdtend.date is null;