J'ai une table qui est une entrée de collection quant au moment où un utilisateur était connecté.
username, date, value
--------------------------
brad, 1/2/2010, 1.1
fred, 1/3/2010, 1.0
bob, 8/4/2009, 1.5
brad, 2/2/2010, 1.2
fred, 12/2/2009, 1.3
etc..
Comment créer une requête qui me donnerait la date la plus récente pour chaque utilisateur?
Mise à jour: j'ai oublié que je devais avoir une valeur qui correspond à la dernière date.
sql
greatest-n-per-group
tete de poisson
la source
la source
Réponses:
la source
max(date)
retournerait une date qui joindrait plusieurs enregistrements). Pour éviter ce problème, il serait préférable d'utiliser la solution de @ dotjoe: stackoverflow.com/a/2411763/4406793 .Utilisation de fonctions de fenêtre (fonctionne dans Oracle, Postgres 8.4, SQL Server 2005, DB2, Sybase, Firebird 3.0, MariaDB 10.3)
la source
username
, dans ce cas) et ne nécessite même pas un champ "ordonnable" unique (comme se joindremax(date)
à d'autres réponses).order by date desc, id desc)
.Je vois que la plupart des développeurs utilisent une requête en ligne sans tenir compte de son impact sur les énormes données.
Tout simplement, vous pouvez y parvenir en:
la source
Pour obtenir la ligne entière contenant la date maximale pour l'utilisateur:
la source
la source
D'après mon expérience, le moyen le plus rapide est de prendre chaque ligne pour laquelle il n'y a pas de ligne plus récente dans le tableau.
Un autre avantage est que la syntaxe utilisée est très simple et que la signification de la requête est assez facile à saisir (prenez toutes les lignes de sorte qu'aucune ligne plus récente n'existe pour le nom d'utilisateur considéré).
N'EXISTE PAS
ROW_NUMBER
JOINTURE INTERNE
JOINTURE EXTERNE GAUCHE
la source
SELECT username, value FROM t WHERE NOT EXISTS ( SELECT * FROM t AS witness WHERE witness.date > t.date AND witness.username = t.username );
Celui-ci devrait vous donner le résultat correct pour votre question modifiée.
La sous-requête s'assure de ne trouver que les lignes de la dernière date, et l'extérieur
GROUP BY
s'occupera des liens. Lorsqu'il y a deux entrées pour la même date pour le même utilisateur, il retournera celle avec le plus hautvalue
.la source
Vous pouvez également utiliser la fonction de classement analytique
la source
Résoudrait le problème mis à jour. Cela pourrait ne pas fonctionner si bien sur de grandes tables, même avec une bonne indexation.
la source
la source
Pour Oracle trie le jeu de résultats dans l'ordre décroissant et prend le premier enregistrement, vous obtiendrez donc le dernier enregistrement:
la source
la source
la source
Select * from table1 where lastest_date=(select Max(latest_date) from table1 where user=yourUserName)
La requête interne renverra la dernière date de l'utilisateur actuel, la requête externe extraira toutes les données en fonction du résultat de la requête interne.
la source
J'ai utilisé cette méthode pour prendre le dernier enregistrement de chaque utilisateur que j'ai sur ma table. C'était une requête pour obtenir le dernier emplacement pour le vendeur selon l'heure récente détectée sur les appareils PDA.
la source
la source
Ma petite compilation
join
mieux que imbriquéeselect
group by
ne vous donne pas ceprimary key
qui est préférable pourjoin
partition by
en conjonction avecfirst_value
( docs )Voici donc une requête:
Avantages:
where
instruction à l'aide de n'importe quelle colonneselect
toutes les colonnes des lignes filtréesLes inconvénients:
la source
J'ai fait un peu pour ma candidature car:
Voici la requête:
la source
Ceci est similaire à l'une des réponses ci-dessus, mais à mon avis, c'est beaucoup plus simple et plus ordonné. Montre également une bonne utilisation de l'instruction cross-apply. Pour SQL Server 2005 et supérieur ...
la source
la source
Cela devrait également fonctionner afin d'obtenir toutes les dernières entrées pour les utilisateurs.
la source
Vous utiliseriez la fonction d'agrégation MAX et GROUP BY
la source
value
, pas celui associé à laMAX(date)
ligne.