2009-11-09 8 views
7

Tous,Accès requête SQL: trouver la ligne avec la date la plus récente pour chaque entrée distincte dans une table

Je suis sûr que ce soit une assez simple question de requête SQL, mais je suis sûr qu'il ya une bonne façon , et un très mauvais moyen, pour ce faire. Livré à moi-même, je risque de me retrouver avec ce dernier. Alors ...

J'ai une table dans Access avec des données qui ressemble à ceci:

ID  Value As_of 
1173 156 20090601 
1173 173 20081201 
1173 307 20080901 
1173 305 20080601 
127  209 20090301 
127  103 20081201 
127  113 20080901 
127  113 20080601 
1271 166 20090201 
1271 172 20081201 
1271 170 20080901 
1271 180 20080601 
... 

Ce que je voudrais obtenir est la « valeur » pour chaque ID unique avec les plus récentes « Comme De "date" (qui est au format AAAAMM).

Alors, mon jeu de résultats devrait ressembler à ceci:

ID  Value As_of 
1173 156  20090601 
127  209  20090301 
1271 166  20090201 

Notez que différents ID auront une « Comme de » dates. En d'autres termes, je ne peux pas simplement identifier le plus récent de globalement, puis sélectionner chaque ligne avec cette date.

Pour ce que cela vaut, cette table contient environ 200 000 lignes et environ 10 000 ID uniques.

Merci beaucoup d'avance!

Répondre

8

Si vous avez besoin à la fois la date et la valeur, vous devez faire une jointure:

SELECT ID, Value,As_of 
from yourTable a inner join 
      (SELECT ID, MAX(As_of) as As_of 
      from yourTable group by ID) b 
on a.ID=b.ID and a.As_of = b.As_of 
+0

Radu - Je voulais juste vous remercier pour cette réponse - fonctionne parfaitement, et environ 99,99% plus rapide que l'original imbriqué "Select Max" j'ai essayé. À la vôtre, Matt – mattstuehler

+0

Bon travail ... :) –

0

Je ne sais pas quelle plate-forme que vous cherchez à faire, mais dans T-SQL, vous pouvez effectuer les opérations suivantes:

SELECT t.* 
FROM (
    SELECT ID, MAX(As_Of) as r1 
    FROM myTable 
    GROUP BY ID 
    ) as dt 
INNER JOIN myTable t ON dt.ID = t.ID and dt.r1 = t.As_Of 

Bonne chance!

EDIT: Eh bien ma mauvaise réponse me dérangeait donc je l'ai corrigé, même si cette réponse existe déjà ailleurs sur la page maintenant.

+0

désolé, je ne vois que vous avez dit accès était le db. Cela devrait encore fonctionner pour vous j'espère! – Funka

+0

Je crois que vous vouliez regrouper par valeur et ID car il demande la valeur par ID pour la date max. –

+0

-1 Cela ne fait même pas référence à l'ID, donc il ne répondra pas au besoin. Il pourrait être imbriqué dans une autre requête et bien se débrouiller ... – Smandoli

0

Je pense que ce que vous cherchez est le suivant:

select id, valeur, as_of de nom_table où as_of = max (as_of) groupe par id

Ceci indique pour chaque ID, trouver le max as_of, et obtenez cette valeur.

Ceci est un sql générique. Je ne suis pas sûr de l'accès. Je suis sûr que si cela ne fonctionne pas, il y a quelque chose de similaire.

Bonne chance! Joe

4

@Funka, cela ne fonctionnera que si vous avez en double « valeur » valeurs différentes de ID - qui vous donnera essentiellement une liste groupée par « valeur », et non par id ...

@ Joe Passable, les agrégats ne sont pas autorisés dans les clauses where sans sous-requête/ayant aussi, au moins pas dans ANSI ...

Cela vous donnera la liste, mais donnera des doublons aussi bien si vous avez plusieurs lignes avec le même identifiant/As_of valeurs:

select t1.id, t1.value, t1.As_of 
from tableName t1 
join (
     select id as id, max(As_of) as max_as_of 
     from tableName 
     group by id 
    ) t2 
on  t1.id = t2.id 
and  t1.As_of = t2.max_as_of 

Si vous voulez supprimer les doublons de cela, vous avez juste veulent ajouter une distincte au sommet de sélection, comme ceci:

select distinct t1.id, t1.value, t1.As_of 
from tableName t1 
join (
     select id as id, max(As_of) as max_as_of 
     from tableName 
     group by id 
    ) t2 
on  t1.id = t2.id 
and  t1.As_of = t2.max_as_of 
+0

bien, ils sont tous les deux corect! mais où est le distinct? :-) – Radu094

+0

désolé, juste édité pour l'ajouter à la requête du bas ... copier/coller frappe à nouveau ... – chadhoc

+0

Chadhoc - Je voulais juste vous remercier pour cette réponse - cela fonctionne parfaitement. Je t'aurais crédité de la "réponse acceptée", sauf que j'avais déjà donné ça à Radu. Je ne sais pas quel est le protocole pour cela - les deux réponses étaient tout aussi utiles et correctes. Et dérange ont été soumis en même temps. – mattstuehler

1

Essayez quelque chose comme ça

SELECT t1.* 
FROM (SELECT Table1.ID, Max(Table1.As_Of) AS MaxOfAs_Of 
FROM Table1 
GROUP BY Table1.ID 
) AS MaxIDS INNER JOIN Table1 t1 ON MaxIDS.ID = t1.ID 
and MaxIDS.MaxOfAs_Of = t1.As_Of 
Questions connexes