Sql 获取max group by中的行的其余部分

Sql 获取max group by中的行的其余部分,sql,oracle,group-by,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

我正在努力获得最近通过的培训。要做到这一点,我有一个非常有效的观点

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\u for\u months
,因为它抱怨
ORA-00979:不是一个表达式分组


我只想得到那一排剩下的东西。我该怎么做呢?

我想这会解决你的问题:

SELECT who.employee_id, course.course_id,
       MAX(add_months(sess.end_date, vers.valid_for_months))
这是最晚的结束日期。如果需要上次会话的结束日期,请使用
行号()


通过将其添加到组中,或将其选择为最大值或最小值…但不能保证其值相同。你可以参加12个月的复习课程,也可以参加36个月的完整课程。如果我将它添加到groupby,它将捕获这两个,并且我只想要一行。(是的,我意识到你可能需要36个月,然后2个月后需要12个月,你会在12个月内被列为不合规,而不是像你应该的34个月,我的业务用户已经决定这没关系——始终使用最近的课程。)
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;