2014-05-16 3 views
0

나는 가장 최근에 통과 한 훈련을 습득하려고합니다. 이렇게하려면 훌륭한 작품보기가 있습니다.최대 그룹의 나머지 행 가져 오기

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 

좋아요, 그럼 내 쿼리가 훌륭하게 작동합니다. 여기에 내 문제가 있습니다. 또한 만료일이 필요하므로 준수 여부가 언제인지 알 수 있습니다. 이것은 버전에 개월 수로 저장됩니다. 그러나 ORA-00979: not a GROUP BY expression을 불평하므로 vers.valid_for_months을 추가 할 수 없습니다.

그 행의 나머지 부분을 얻고 싶습니다. 어떻게해야합니까?

+0

그룹 별에 추가 또는 MAX 또는 MIN ... – nhgrif

+0

로 선택하지만 같은 값의 보장은 없습니다. 12 개월 동안 만 사용할 수있는 재교육 과정이나 36 개월 동안 사용할 수있는 정식 버전을 이용할 수 있습니다. 에 의해 그룹에 추가하면, 그 두 가지를 잡을 것이고, 나는 단지 1 행만 원한다. (예, 36 개월이 걸릴 수도 있고 2 개월 후에 12 개월이 걸릴 수도 있고, 34 개월이 아닌 12 개월 만에 규정에 위배되는 것으로 나타 났을 수도 있습니다. 비즈니스 사용자 괜찮습니다. 항상 최근에 찍은 과정을 사용하십시오.) – corsiKa

답변

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;