J'ai une table avec des données comme les suivantes: Nom, Ville, Dernière mise à jour. Je veux obtenir toutes les données de la table distinctes par nom, mais enregistrer seulement où la dernière mise à jour est la dernière.
Par exemple. s'il y a 2 enregistrements
Bill, LA, 2017-09-11
Bill, NY, 2017-09-19
Dans ce qui précède, la requête ne devrait renvoyer que l'enregistrement Bill, NY, 2017-09-19. De cette façon, je veux tous les enregistrements où le nom est distinct mais la dernière mise à jour est la dernière (décroissante).
Quelle requête sql ferait le travail?MySQL - SELECT toutes les colonnes où une colonne est DISTINCT par Dernière date
Répondre
Je poste ceci principalement parce que les autres réponses/commentaires ont semblé être outre de ce dont vous avez besoin ici. Si tout ce que vous vouliez obtenir étaient la mise à jour lastest associée à chaque nom, vous pouvez utiliser la requête simple GROUP BY
suivante:
SELECT Name, MAX(LastUpdated)
FROM yourTable
GROUP BY Name
Mais si vous voulez obtenir le plein dernier enregistrement (ie toutes les colonnes) pour chaque nom, vous rencontrez un problème parce que GROUP BY
nous permet seulement de sélectionner Name
ou d'autres colonnes dans un agrégat (pas tout à fait vrai si l'autre colonne peut être uniquement déterminée par Name
, mais vrai en général). Une façon canonique d'aller ici serait de simplement joindre votre table d'origine à ce qui précède en tant que sous-requête, et filtrer toutes les lignes à l'exception de la dernière pour chaque nom.
SELECT t1.*
FROM yourTable t1
INNER JOIN
(
SELECT Name, MAX(LastUpdated) AS max_last_updated
FROM yourTable
GROUP BY Name
) t2
ON t1.Name = t2.Name AND
t1.LastUpdated = t2.max_last_updated
SELECT t1.*
FROM Tablename AS t1
(
SELECT name, MAX(LastUpdated) AS LastUpdated
FROM Tablename
GROUP BY name
) AS t2 INNER JOIN t1.name = t2.name
AND t1.LastUpdated = t2.LastUpdated
Ceci peut être résolu en deux étapes:
- Trouver la ligne avec le LAST_UPDATED_DATE
- afficher toutes les données de cette ligne.
La requête pourrait être:
SELECT
t.name,
t.city,
t.last_updated
FROM yourtable t
WHERE t.last_updated = (
SELECT MAX(s.last_updated)
FROM yourtable s
WHERE s.name = t.name
);
Merci. Cependant, je peux remplacer SELECT t.name, t.city, t.last_updated avec t. * Ici. – Greatchap
Oui, vous pouvez, mais c'est une meilleure pratique et plus facile à maintenir si vous spécifiez les noms de colonnes plutôt que t. * – bbrumm
Si je souhaite ajouter une clause where par exemple. recherche sur la base du nom ou de toute colonne et obtenir le dernier record alors que faire? – Greatchap
Qu'avez-vous essayé jusqu'à présent? – bbrumm
Avez-vous cherché dans Stack Overflow avant de l'afficher pour voir si vous pouviez trouver une solution déjà existante? –
J'ai fait une recherche sur Stack Overflow mais je n'ai pas trouvé la réponse dont j'avais besoin. – Greatchap