Question

Il est courant d'avoir une table où, par exemple, les champs sont compte, la valeur et le temps.Quel est le meilleur modèle de conception pour la récupération de la dernière valeur pour chaque compte?Malheureusement, le dernier mot-clé dans un groupement, vous donne le dernier enregistrement physique dans la base de données, pas le dernier enregistrement par le tri.Ce qui signifie à mon humble avis il ne doit jamais être utilisé.Les deux maladroits approches que j'utilise sont une sous-requête ou secondaire la requête pour déterminer le dernier enregistrement, puis de se joindre à la table pour trouver la valeur.N'est-il pas plus élégant approche?

Était-ce utile?

La solution

La sous-requête option sonne le mieux pour moi, quelque chose comme ce qui suit pseudo-sql.Il peut être possible/nécessaire de l'optimiser par une jointure, qui dépendra des capacités du moteur SQL.

select * 
from table 
where account+time in (select account+max(time) 
                       from table 
                       group by account 
                       order by time) 

Autres conseils

C'est un bon truc pour le retour du dernier enregistrement dans une table:

SELECT TOP 1 * FROM TableName ORDER BY Time DESC  

Découvrez ce site pour plus d'info.

ne pourriez-vous pas faire:

select account,last(value),max(time)
from table
group by account

J'ai testé cette (valable pour un très petit, presque banal jeu d'enregistrements) et il a produit des résultats corrects.

Edit:

aussi ne fonctionne pas après quelques tests supplémentaires.J'ai fait un peu juste de la programmation d'accès dans une vie passée et se sentir comme il est un moyen de faire ce que votre demande en 1 de la requête, mais im dessin un vide pour le moment.désolé.

@Tom Il peut être plus facile pour moi, en général, de faire de la "Dans" la requête que vous avez suggéré.Généralement je fais quelque chose comme

select T1.account, T1.value
from table T as T1
where T1 = (select max(T2.time) from table T as T2 where T1.account = T2.Account) 

Après avoir littéralement des années de recherche j'ai enfin trouvé la réponse sur le lien ci-dessous #3.Les sous-requêtes ci-dessus fonctionne, mais sont très lents -- debilitatingly lent pour mes fins.

Le plus populaire réponse est un tri-requête de niveau:1er niveau trouve au max, 2e niveau obtient les valeurs de champ basé sur la 1ère requête.Le résultat est ensuite jointe à une table de la requête principale.Rapide, mais compliqué et prend du temps à code ou à maintenir.

Ce lien fonctionne, fonctionne toujours très vite et est beaucoup moins de travail/de code à maintenir.Merci aux auteurs de ce site.

http://access.mvps.org/access/queries/qry0020.htm

@shs
oui, c'sélectionnez la dernière(valeur) DEVRAIT fonctionner, mais il n'est pas...Ma compréhension, bien que je ne peut pas produire une source faisant autorité, c'est que la dernière(valeur) donne le dernier enregistrement physique dans le fichier d'accès, ce qui signifie qu'il pourrait être le premier timewise mais le dernier physiquement.Donc je ne pense pas que vous devriez utiliser la dernière(valeur) pour rien d'autre qu'une très mauvaise ligne au hasard.

J'essaie de trouver la date la plus récente dans un groupe à l'aide de l'Accès 2003 générateur de requêtes, et a couru dans le même problème en essayant de l'utiliser pour un champ date.Mais il semble que l'aide de MAX découvre au cours de la dernière date.

Peut-être le SQL suivant est maladroit, mais il semble fonctionner correctement dans l'Accès.

SELECT
    a.account,
    a.time,
    a.value
FROM
    tablename AS a INNER JOIN [
        SELECT
            account,
            Max(time) AS MaxOftime
        FROM
            tablename
    GROUP BY
        account
    ]. AS b
    ON
        (a.time = b.MaxOftime)
        AND (a.account = b.account)
;
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top