-- Las funciones de ventana poseen mucho potencial, pero no quiere decir que siempre se deban usar.

-- En este caso de uso, el sistema posee una sola tabla donde guarda la gestión de 
-- la asignación de una cita. (Una cita se puede asignar, y luego volver a reasignarse).
-- Todos los cambios en la asignación quedan registrados.  Para saber cual fue la última
-- asignación, se puede usar una Windows Function (Los de la vieja escuela lo hacen con Group By).

SELECT asignacion_cita.*
FROM appointment
LEFT JOIN (SELECT schedule_logs.current,
            schedule_logs.description,
            schedule_logs.appointment_code,
            user_sonata.username, 
			row_number() OVER (PARTITION BY schedule_logs.appointment_code ORDER BY schedule_logs.id DESC) AS ranking
           FROM schedule_logs
		   LEFT JOIN user_sonata ON user_sonata.id = schedule_logs.id_user
		   WHERE schedule_logs.action = 'ASIGNACION') as  asignacion_cita ON asignacion_cita.appointment_code = appointment.appointment_code
WHERE COALESCE(asignacion_cita.ranking,1) = 1;

-- Windows Function: http://www.postgresqltutorial.com/postgresql-window-function/
