2008-12-18 18 views
11

Bien que cette question semble simple, elle est plutôt délicate.Comment trouver l'enregistrement dans un tableau qui contient la valeur maximale?

J'ai une table avec les colonnes suivantes:

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

je voudrais obtenir le « ID » et « valeur » des enregistrements qui contiennent le maximum « date » regroupés par la colonne « groupe » . Quelque chose comme "quelle est la valeur la plus récente pour chaque groupe?"

je peux obtenir chaque groupe et sa date maximale:

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

Mais je voudrais avoir le « ID » et de la valeur du dossier avec la plus la date. Faire un JOIN entre A et le résultat pourrait être la réponse, mais il n'y a pas moyen de savoir à quel enregistrement MAX (date) se réfère (dans le cas où la "date" se répète).

Quelqu'un peut-il aider?

Répondre

8

Vous pouvez essayer avec une sous-requête

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

Tant que la colonne de date est unique pour chaque groupe, je pense que quelque chose comme cela pourrait fonctionner:

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

il est pas unique – Jonas

+0

qui le rend un peu difficile de trouver un seul enregistrement le plus récent pour chaque groupe:] –

4

Ceci est exactement ce que les fonctions analytiques ont été fait pour:

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 date est unique, alors vous avez déjà votre réponse. Si la date n'est pas unique, vous avez besoin d'un autre unique. En l'absence d'une clé naturelle, votre ID est aussi bon que n'importe quel. Il suffit de mettre un MAX (ou MIN, selon ce que vous préférez) sur elle:

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