8
votes

Accéder à SQL Query: Trouvez la ligne avec la date la plus récente pour chaque entrée distincte dans une table

Tout,

Je suis sûr que c'est une jolie question de requête SQL simple, mais je suis sûr qu'il y a un bon moyen et une très mauvaise façon, de faire cela. Gauche à mes propres appareils, je suis susceptible de finir avec ce dernier. Donc ... p>

J'ai une table dans l'accès avec des données qui ressemblent à ceci: p> xxx pré>

Ce que je voudrais obtenir est la "valeur "Pour chaque identifiant unique avec la date la plus récente" à partir de "(qui est au format yyyyymm). p>

Donc, mon ensemble de résultats devrait ressembler à ceci: P>

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


0 commentaires

5 Réponses :


0
votes

Vous ne savez pas quelle plate-forme vous cherchez à faire cela, mais dans T-SQL, vous pouvez procéder comme suit:

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


6 commentaires

Désolé, je vois que vous avez dit que l'accès était le dB. Cela devrait toujours fonctionner pour vous, j'espère!


Je crois que vous vouliez grouper de valeur et d'identité car il demande la valeur par ID pour la date maximale.


-1 Cela n'a même pas l'identifiant de référence, il ne remplira donc pas le besoin. Il pourrait être imbriqué dans une autre requête et travailler tout droit ...


Je meurs pour comprendre pourquoi au moins deux personnes ont évoqué cette réponse?


Funka, merci pour votre réponse. Cependant, ce n'est pas tout à fait ce que je cherche. J'essaie d'identifier la valeur avec la date maximale "AS_OF" pour chaque identifiant unique dans ma table. Mes excuses si mon message original n'était pas clair.


Ceci est simplement un cas de moi ne lisant pas complètement la question. Je semble avoir supposé ID était une colonne auto-numérique ou d'identité. Vous êtes tous corrects que cela est incorrect! Le groupe par le groupe serait sur la colonne id , et vous pouvez l'utiliser dans une table interne ou une table dérivée pour rejoindre la valeur. Je voudrais éditer ma réponse mais on dirait qu'il y a déjà quelque chose correct sur cette page. Désolé pour la confusion!



0
votes

Je pense que ce que vous cherchez est ceci:

Sélectionnez l'ID, la valeur, AS_OF de TABLE_NAME où as_of = max (as_of) groupe par ID

Ceci dit pour chaque identifiant, trouvez le max as_of et obtenez cette valeur.

Ceci est Générique SQL. 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


0 commentaires

4
votes

@funka, qui ne fonctionnera pas si vous avez des valeurs de "valeur" en double pour différents identifiants - qui vous donneront essentiellement une liste groupée par "valeur", pas par ID ...

@Joe Fair, agrégats Aren 't permis dans les clauses sans sous-requête / ayant un combo également, du moins pas dans ANSI ... P>

Cela vous donnera la liste, mais donnera des doubles duplicates si vous avez plusieurs rangées avec le Même ID / AS_OF Valeurs: P>

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


2 commentaires

Eh bien, ils sont tous deux corect! Mais où est le distinct? :-)


Chadhoc - Je voulais juste vous remercier pour cette réponse - cela fonctionne parfaitement. Je vous aurais crédité de la "réponse acceptée", sauf que j'avais déjà donné cela à la poste de Radu. Je ne sais pas ce que le protocole est pour cela - les deux réponses étaient également utiles et correctes. Et la peine a été soumise en même temps.



9
votes

Si vous avez besoin de la date et de 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


1 commentaires

RADU - Je voulais juste vous remercier pour cette réponse - fonctionne parfaitement et environ 99,99% plus rapide que l'original "Select Max" J'ai essayé. Bravo, Matt



1
votes

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


0 commentaires