funcion sql sql-server sql-server-2000

funcion - sql server filter by max date



SQL seleccione max(fecha) y el valor correspondiente (4)

Posible duplicado:
¿Cómo obtener el registro de una tabla que contiene el valor máximo?

Tengo una consulta agregada como la siguiente:

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

Lo que funciona, y devuelve datos correctos la mayor parte del tiempo, pero noté un problema. El campo de Notas que se devuelve no necesariamente coincidirá con el registro del que proviene la fecha máxima (completedDate). En cambio, ¿será el que tiene la cadena más larga? ¿O el de mayor valor ASCII? ¿Qué hace SQL Server en caso de un empate entre dos registros? Ni siquiera estoy seguro. Lo que quiero obtener es el campo de notas del registro max (completedDate). ¿Cómo debo hacer para hacer esto?


Ah sí, así es como se pretende en SQL. Obtienes el máximo de cada columna por separado. Parece que desea devolver los valores de la fila con la fecha máxima, por lo que tiene que seleccionar la fila con la fecha máxima. Prefiero hacer esto con una subselección, ya que las consultas son compactas y fáciles de leer.

SELECT TrainingID, CompletedDate, Notes FROM HR_EmployeeTrainings ET WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID) AND CompletedDate in (Select Max(CompletedDate) from HR_EmployeeTrainings B where B.TrainingID = ET.TrainingID)

Si también desea hacer coincidir con AntiRecID, también debe incluirlo en la subselección.


Cada función MAX es evaluada individualmente. Así que MAX (CompletedDate) devolverá el valor de la última columna CompletedDate y MAX (Notes) devolverá el valor máximo (es decir, alfabéticamente y el más alto).

Necesita estructurar su consulta de manera diferente para obtener lo que desea. Esta pregunta ya había sido formulada y contestada varias veces, por lo que no la repetiré:

¿Cómo encontrar el registro en una tabla que contiene el valor máximo?

Encontrar el registro con valor máximo en SQL.


No hay una manera fácil de hacer esto, pero algo como esto funcionará:

SELECT ET.TrainingID, ET.CompletedDate, ET.Notes FROM HR_EmployeeTrainings ET inner join ( select TrainingID, Max(CompletedDate) as CompletedDate FROM HR_EmployeeTrainings WHERE (ET.AvantiRecID IS NULL OR ET.AvantiRecID = @avantiRecID) GROUP BY AvantiRecID, TrainingID ) ET2 on ET.TrainingID = ET2.TrainingID and ET.CompletedDate = ET2.CompletedDate


Puedes usar una subconsulta. La subconsulta obtendrá el Max(CompletedDate) . Luego toma este valor y vuelve a unirte a tu tabla para recuperar la nota asociada con esa fecha:

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