J'essaie d'obtenir le dernier enregistrement datetime d'une table qui stocke plusieurs statuts. Ma table ressemble à ceci:
+---------+------------------------+-------+
|filename |Dates |Status |
+---------+------------------------+-------+
|abc.txt |2012-02-14 12:04:45.397 |Open |
|abc.txt |2012-02-14 12:14:20.997 |Closed |
|abc.txt |2013-02-14 12:20:59.407 |Open |
|dfg.txt |2012-02-14 12:14:20.997 |Closed |
|dfg.txt |2013-02-14 12:20:59.407 |Open |
+---------+------------------------+-------+
Les résultats devraient être
+---------+------------------------+-------+
|filename |Dates |Status |
+---------+------------------------+-------+
|abc.txt |2013-02-14 12:20:59.407 |Open |
|dfg.txt |2013-02-14 12:20:59.407 |Open |
+---------+------------------------+-------+
Si vous voulez une ligne pour chaque nom de fichier, reflétant des états spécifiques et listant la date la plus récente, voici votre ami:
select filename ,
status ,
max_date = max( dates )
from some_table t
group by filename , status
having status = '<your-desired-status-here>'
Facile!
SELECT * FROM table
WHERE Dates IN (SELECT max(Dates) FROM table);
SELECT TOP 1 * FROM foo ORDER BY Dates DESC
Renverra un résultat avec la dernière date.
SELECT * FROM foo WHERE foo.Dates = (SELECT MAX(Dates) FROM foo)
Renverra tous les résultats qui ont la même date maximale, en milissecondes.
Ceci est pour SQL Server. Je vous laisse utiliser la fonction DATEPART si vous voulez utiliser des dates mais pas des heures.
ce travail
SELECT distinct filename
,last_value(dates)over (PARTITION BY filename ORDER BY filename)posd
,last_value(status)over (PARTITION BY filename ORDER BY filename )poss
FROM distemp.dbo.Shmy_table
Considérant que max (dates) peut être différent pour chaque nom de fichier, ma solution:
select filename, dates, status
from yt a
where a.dates = (
select max(dates)
from yt b
where a.filename = b.filename
)
;
http://sqlfiddle.com/#!3/c94a2/2
HTH
La syntaxe exacte dépendra bien sûr de la base de données, mais quelque chose comme:
SELECT * FROM my_table WHERE (filename, Dates) IN (SELECT filename, Max(Dates) FROM my_table GROUP BY filename)
Cela vous donnera des résultats exactement ce que vous demandez et affiche ci-dessus. Violon: http://www.sqlfiddle.com/#!2/3af8a/1/
select max(dates)
from yourTable
group by dates
having count(status) > 1