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;