You haven't specified which DBMS you're using. Assuming Microsoft SQL Server 2005 or later,
the ROW_NUMBER
ranking function[
^] should work:
WITH cteRankedData As
(
SELECT
a.PatientAccountID,
e.FindingAbbr,
e.Value,
e.CreationTime,
ROW_NUMBER() OVER (PARTITION BY e.FindingAbbr ORDER BY e.CreationTime DESC) As RN
FROM
PatientVisitInfo a with (nolock)
INNER JOIN Assessment d with (nolock)
ON a.PatientVisit_oid = d.PatientVisit_oid
INNER JOIN Observation e with (nolock)
ON e.AssessmentID = d.AssessmentID
WHERE
a.PatientAccountID= '11'
AND
a.VisitTypeCode='IP'
AND
a.VisitEndDateTime is null
AND
e.Value <> ''
AND
e.FindingAbbr IN ('A_IV1 Site', 'A_IV2 Site', 'A_IV3 Site', 'A_IV4 Site')
)
SELECT
PatientAccountID,
FindingAbbr,
Value,
CreationTime As LatestCreationTime
FROM
cteRankedData
WHERE
RN = 1
ORDER BY
PatientAccountID,
FindingAbbr,
Value
;