I've got some code to return a list of all enquiries where one of the enquiry_status_codes are present from a predetermined list.
select
central_enquiry.enquiry_number,
central_enquiry.enquiry_time,
type_of_service.service_name,
enquiry_subject.subject_name,
central_enquiry.enq_status_code,
enquiry_status.enq_status_name,
central_enquiry.follow_up_code,
follow_up.follow_up_name,
central_enquiry.follow_up_date,
CASE
WHEN ROUND((central_enquiry.follow_up_date - SYSDATE),2) >=14 AND
ROUND((central_enquiry.follow_up_date - SYSDATE),2) <= 100 THEN 'Over 2 Weeks'
WHEN ROUND((central_enquiry.follow_up_date - SYSDATE),2) >=7 AND
ROUND((central_enquiry.follow_up_date - SYSDATE),2) <= 13.99 THEN '1 - 2 Weeks'
WHEN ROUND((central_enquiry.follow_up_date - SYSDATE),2) >=2 AND
ROUND((central_enquiry.follow_up_date - SYSDATE),2) <= 6.99 THEN '2 - 7 Days'
WHEN ROUND((central_enquiry.follow_up_date - SYSDATE),2) >=1 AND
ROUND((central_enquiry.follow_up_date - SYSDATE),2) <= 1.99 THEN 'Tomorrow'
WHEN ROUND((central_enquiry.follow_up_date - SYSDATE),2) >=0 AND
ROUND((central_enquiry.follow_up_date - SYSDATE),2) <= 0.99 THEN 'Today'
ELSE 'Deadline Missed'
END as Length_Paused,
central_enquiry.log_text,
enquiry_status_log.enquiry_log_number,
enquiry_status_log.enq_status_code,
enquiry_status.enq_status_name,
enquiry_status_log.follow_up_date
from
central_enquiry
inner join type_of_service on central_enquiry.service_code = type_of_service.service_code
inner join enquiry_subject on central_enquiry.subject_code = enquiry_subject.subject_code
inner join follow_up on central_enquiry.follow_up_code = follow_up.follow_up_code
inner join enquiry_status_log on central_enquiry.enquiry_number = enquiry_status_log.enquiry_number
inner join enquiry_status on enquiry_status_log.enq_status_code = enquiry_status.enq_status_code
where
enquiry_status_log.enq_status_code in ('EN90','EN11','EN40','EN91','EN12') and
central_enquiry.outstanding_flag = 'Y'
and
(enquiry_status_log.enq_status_code IN ('EN11', 'EN12','EN40') AND enquiry_status_log.follow_up_date
< SYSDATE) OR
enquiry_status_log.enq_status_code IN ('EN90', 'EN91')
order by
central_enquiry.enquiry_number, enquiry_status_log.enquiry_log_number desc
What I would like to do is restrict this so that for each enquiry_number it only returns the line with the highest enquiry_status_log.enquiry_log_number value.
I think this needs a MAX statement in there somewhere, but everything I try keeps coming back with a user error.
Edit: Have tried using the following code:
(
select
enquiry_status_log.enquiry_number,
enquiry_status_log.enquiry_log_number, follow_up.follow_up_name,
enquiry_status_log.follow_up_date,
rank() over (partition by enquiry_status_log.enquiry_number
order by enquiry_status_log.enquiry_log_number desc) rn
from
enquiry_status_log
join follow_up on enquiry_status_log.follow_up_code =
follow_up.follow_up_code
)
table1
select
enquiry_number,
enquiry_log_number,
follow_up_name,
follow_up_date
from table1
where rn = 1
order by enquiry_number, enquiry_log_number