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?
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