Rei*_*lly 2 mysql sql aggregate-functions greatest-n-per-group
MySql 5.5.
我有一个代表工作任务的表:
empId jobNo workDate hours
4 441 10/1/2012 10
4 441 9/1/2012 22
4 441 8/1/2012 6
Run Code Online (Sandbox Code Playgroud)
而代表薪水的人:
empId effDate rate
4 10/1/2012 6.50
4 9/1/2012 5.85
4 6/1/2012 4.00
Run Code Online (Sandbox Code Playgroud)
工资适用于生效日期或之后完成的所有工作.所以jun,jul和aug的比率是4.00; sep是5.85,oct是6.50.
如果我天真地查询十月的工作:
SELECT Work.empId, Work.jobNo, Work.workDate, Work.hours, Salary.effDate, Salary.rate
FROM Work
JOIN Salary ON Work.empId = Salary.empId
WHERE Work.workDate <= '2012-10-01'
AND Salary.effDate <= Work.workDate
ORDER BY Work.jobNo ASC, Work.workDate DESC;
Run Code Online (Sandbox Code Playgroud)
我没有得到我想要的东西.我得到类似的东西
4 441 10/1/2012 10 10/1/2012 6.50
4 441 10/1/2012 10 9/1/2012 5.85
4 441 10/1/2012 10 6/1/2012 4.00
4 441 9/1/2012 22 9/1/2012 5.85
4 441 9/1/2012 22 6/1/2012 4.00
4 441 8/1/2012 6 6/1/2012 4.00
Run Code Online (Sandbox Code Playgroud)
当我想要的时候
4 441 10/1/2012 10 10/1/2012 6.50
4 441 9/1/2012 22 9/1/2012 5.85
4 441 8/1/2012 6 6/1/2012 4.00
Run Code Online (Sandbox Code Playgroud)
我无法完全了解如何创建我想要的查询.
真实情况显然有多个员工,多个工作岗位.
谢谢你的帮助.
这是您的实际问题:您希望能够根据工作日期x工资生效日期检测工作中的每条记录,相应的有效费率是多少.如果您只是Salary.effDate <= WORK.workDate
在工作日期之前获得所有费率.但你只想要最新的一个.
这是每组最大问题的一个稍微复杂的变体.有很多方法可以做到这一点,这里有一个:
SELECT sel.*, Salary.Rate
FROM
(
SELECT Work.empId, Work.jobNo, Work.workDate,
Work.hours, Max(Salary.effDate) effDate
FROM WORK
JOIN Salary ON WORK.empId = Salary.empId
WHERE WORK.workDate <= '2012-10-01'
AND Salary.effDate <= WORK.workDate
GROUP BY WORK.empId, WORK.jobNo, WORK.workDate, WORK.hours
ORDER BY WORK.jobNo ASC, WORK.workDate DESC
) sel
INNER JOIN Salary ON sel.empId = Salary.empId
AND sel.EffDate = Salary.EffDate
Run Code Online (Sandbox Code Playgroud)
首先,内部查询检测每个工作记录的最近工资生效日期.然后,我们再次将薪水加入薪水.
看看工作的SQLFiddle.