获取最大组中的其余行

时间:2014-05-16 22:26:12

标签: sql oracle group-by

我正在努力获得最近通过的某人所接受的培训。要做到这一点,我有一个很好的视图

CREATE OR REPLACE FORCE VIEW MYAPP.most_recent_training (
  employee_id, course_id, date_taken
) AS SELECT
       who.employee_id,
       course.course_id,
       MAX(sess.end_date) date_taken
  FROM employee_session_join esj
  JOIN training_session sess on sess.session_id = esj.session_id
  JOIN course_version vers on vers.version_id = sess.version_id
  JOIN course course on course.course_id = vers.course_id
  JOIN employee who on who.employee_id = esj.employee_id
  WHERE esj.active_flag = 'Y'
    AND sess.active_flag = 'Y'
    AND course.active_flag = 'Y'
    AND who.active_flag = 'Y'
    AND esj.approval_status = 5 -- successfully passed
GROUP BY who.employee_id, course.course_id

好的,所以我的查询非常好。这是我的问题 - 我还需要有效期,所以我知道他们什么时候不合规。这个版本存储了几个月。但我无法添加vers.valid_for_months因为它抱怨ORA-00979: not a GROUP BY expression

我只想得到该行的其余部分。我怎么能这样做?

1 个答案:

答案 0 :(得分:1)

我认为这可以解决您的问题:

SELECT who.employee_id, course.course_id,
       MAX(add_months(sess.end_date, vers.valid_for_months))

这是最新的结束日期。如果您想要上次会话的结束日期,请使用row_number()

SELECT employee_id, course_id, end_date
FROM (SELECT who.employee_id, course.course_id, sess.end_date,
             row_number() over (partition by who.employee_id, course.course_id
                                order by sess.end_date
                               ) as seqnum
      FROM employee_session_join esj
      JOIN training_session sess on sess.session_id = esj.session_id
      JOIN course_version vers on vers.version_id = sess.version_id
      JOIN course course on course.course_id = vers.course_id
      JOIN employee who on who.employee_id = esj.employee_id
      WHERE esj.active_flag = 'Y'
        AND sess.active_flag = 'Y'
        AND course.active_flag = 'Y'
        AND who.active_flag = 'Y'
        AND esj.approval_status = 5 -- successfully passed
) e
WHERE seqnum = 1;