按日期查询SQL

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)

我无法完全了解如何创建我想要的查询.
真实情况显然有多个员工,多个工作岗位.

谢谢你的帮助.

Adr*_*iro 5

这是您的实际问题:您希望能够根据工作日期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.