从Select max()查询中获取正确的行结果

时间:2016-07-16 22:03:10

标签: mysql

可用性表是

try {
    Object x = hahaList.get(0).newInstance(); 
} catch (InstantiationException | IllegalAccessException e) {
    throw new RuntimeException(e); 
}

我一直在尝试以下查询的各种版本。

    | avail_id | emp_id | effective_date | Friday | Saturday | Sunday |
    | 0        | 15     | 2016-07-14     | Yes    | Yes      | No     |
    | 1        | 15     | 2016-06-14     | Yes    | Yes      | Yes    |
    | 2        | 12     | 2016-07-01     | Yes    | No       | No     |
    | 3        | 12     | 2016-07-14     | Yes    | Yes      | Yes    |
    | 4        | 17     | 2016-05-14     | No     | Yes      | Yes    |
    | 5        | 17     | 2016-06-14     | Yes    | Yes      | Yes    |
    | 6        | 17     | 2016-07-14     | Yes    | No       | No     |

我的目标是为每位员工选择具有最新可用性的行 - 并最终能够选择在给定日期适用的可用性*。不幸的是,我得到的结果将是可用性表中每个员工的第一行中的值混合。例如,它将为员工15提供2016-07-14的生效日期,但会给出与2016-06-14生效日期相对应的其他列值。

*员工可以在3周内开始上学时提交新的可用性,但在今天运行报告时,我希望今天适用,而不是3周。此外,没有适用于所有员工的新可用性的设定日期。

1 个答案:

答案 0 :(得分:0)

可以在max

中使用in子句
SELECT 
    Availability.emp_id
  , Availability.friday
  , Availability.saturday
  , Availability.sunday
  ,  Employees.emp_fname
  , Employees.emp_lname 
FROM Availability 
LEFT JOIN Employees ON Availability.emp_id = Employees.emp_id 
WHERE Employees.active='Yes' 
AND (Availability.emp_id, Availability.effective_date ) in 
        ( select  Availability.emp_id   , max(Availability.effective_date)
           FROM Availability group by Availability.emp_id )
ORDER BY 
      Employees.position_id
    , Employees.emp_lname
    , Employees.emp_fname
    , Availability.effective_date DESC