2008-12-18 15 views
11

Aunque esta pregunta parece simple, es un poco complicado.¿Cómo encontrar el registro en una tabla que contiene el valor máximo?

I tiene una tabla con las siguientes columnas:

table A: 
    int ID 
    float value 
    datetime date 
    varchar(50) group 

me gustaría obtener el "ID" y "valor" de los registros que contienen el máximo "fecha" agrupados por la columna "grupo" . Algo así como "¿Cuál es el valor más nuevo para cada grupo?"

puedo conseguir cada grupo y su fecha máxima:

SELECT group, MAX(date) FROM A GROUP BY group; -- I also need the "ID" and "value"

Pero me gustaría tener el "ID" y el valor del registro con la fecha más alto.

Hacer un JOIN entre A y el resultado podría ser la respuesta, pero no hay forma de saber a qué registro se refiere MAX (date) (en caso de que se repita la "fecha").

¿Alguien puede ayudar?

Respuesta

8

Usted podría intentar con una subconsulta

 
select group, id, value, date from A where date in 
(select MAX(date) as date 
    from A 
    group by group) 
order by group 
0

Mientras la columna de la fecha es única para cada grupo creo que algo como esto podría funcionar:

SELECT A.ID, A.Value 
FROM A 
    INNER JOIN (SELECT Group, MAX(Date) As MaxDate FROM A GROUP BY Group) B 
    ON A.Group = B.Group AND A.Date = B.MaxDate 
+0

que no es única – Jonas

+0

Eso hace que sea un poco difícil de encontrar un solo registro más reciente para cada grupo:] –

4

Esto es justo lo eran las funciones analíticas hecho para:

select group, 
     id, 
     value 
from (
     select group, 
       id, 
       value, 
       date, 
       max(date) over (partition by group) max_date_by_group 
     from A 
     ) 
where date = max_date_by_group 
2

Si la fecha es única, entonces usted ya tiene su respuesta. Si la fecha no es única, entonces necesita algún otro elemento único. En ausencia de una clave natural, su identificación es tan buena como cualquiera. Sólo hay que poner un MAX (o MIN, lo que usted prefiera) en él:

SELECT * 
FROM A 
JOIN (
    --Dedupe any non unqiue dates by getting the max id for each group that has the max date 
    SELECT Group, MAX(Id) as Id 
    FROM A 
    JOIN (
     --Get max date for each group 
     SELECT group, MAX(date) as Date 
     FROM A 
     GROUP BY group 
    ) as MaxDate ON 
     A.Group = MaxDate.Group 
     AND A.Date = MaxDate.Date 
    GROUP BY Group 
) as MaxId ON 
    A.Group = MaxId.Group 
    AND A.Id= MaxId.Id 
Cuestiones relacionadas