J'ai les données ci-dessous et j'ai besoin de voir la date la plus récente à laquelle l'action équivaut à "USED":
A 05/12/2019 07:56 USED B 13/01/2020 14:50 USED
Pour ce qui précède, j'en aurais besoin pour retourner:
XXX
Pour chaque 'Cat', il peut y avoir des centaines d'entrées pour chaque jour et il doit regarder en arrière sur plusieurs années, ne renvoyant que l'entrée la plus récente. J'ai essayé la fonction MAX mais je ne pense pas que cela fonctionne à cause du format de la date.
4 Réponses :
Une façon de le faire est de filtrer avec une sous-requête corrélée:
select t.* from mytable t left join mytable t1 on t1.cat = t.cat and t1.action = t.action and t1.stamp > t.stamp where t.action = 'USED' and t1.cat is null
Une autre solution typique est le modèle anti- jointure gauche
:
XXX
Les deux solutions supposent que stamp
est stocké dans un type de données semblable à date
. Si ce n'est pas le cas, vous avez besoin d'une étape supplémentaire pour convertir la chaîne en date.
Vous pouvez utiliser la sous-requête:
select t.* from table t where t.action = 'used' and t.stamp = (select max(t2.stamp) from table t1 where t1.stamp = t.stamp)
On dirait que le tampon est stocké en tant que varchar au lieu de datetime. Essayez d'abord CAST
.
SELECT cat, MAX(CAST stamp AS DateTime) as MxDate, 'used' as Action FROM mytable WHERE Action = 'used' GROUP BY cat
Ce serait:
select t.cat, max(t.stamp) from t where t.action = 'used' group by t.cat;
Notez que le filtrage est dans la sous-requête.
Ou, peut-être plus simplement comme:
select t.* from t where t.stamp = (select min(t2.stamp) from table t2 where t2.cat = t.cat and t2.action = 'used' );
Veuillez marquer votre question avec la base de données que vous utilisez. Aussi, juste au cas où: quel est le type de données de la colonne
stamp
?