Search code examples
sqlsql-serversql-server-2000

SQL select max(date) and corresponding value


Possible Duplicate:
How to get the record of a table who contains the maximum value?

I've got an aggregate query like the following:

SELECT TrainingID, Max(CompletedDate) as CompletedDate, Max(Notes) as Notes     --This will only return the longest notes entry
FROM HR_EmployeeTrainings ET
WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID)
GROUP BY AvantiRecID, TrainingID            

Which is working, and returns correct data most of the time, but I noticed a problem. The Notes field which gets returned will not necessarily match the record that the max(completedDate) is from. Instead it will be the one with the longest string? Or the one with the highest ASCII value? What does SQL Server do in the event of a tie between two records? I'm not even sure. What I want to get is the notes field from the max(completedDate) record. How should I got about doing this?


Solution

  • You can use a subquery. The subquery will get the Max(CompletedDate). You then take this value and join on your table again to retrieve the note associate with that date:

    select ET1.TrainingID,
      ET1.CompletedDate,
      ET1.Notes
    from HR_EmployeeTrainings ET1
    inner join
    (
      select Max(CompletedDate) CompletedDate, TrainingID
      from HR_EmployeeTrainings
      --where AvantiRecID IS NULL OR AvantiRecID = @avantiRecID
      group by TrainingID
    ) ET2
      on ET1.TrainingID = ET2.TrainingID
      and ET1.CompletedDate = ET2.CompletedDate
    where ET1.AvantiRecID IS NULL OR ET1.AvantiRecID = @avantiRecID