web-dev-qa-db-fra.com

SQL obtenir le dernier enregistrement d'heure date

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   |
+---------+------------------------+-------+
32
Miguel

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!

29
Nicholas Carey
SELECT * FROM table
WHERE Dates IN (SELECT max(Dates) FROM table);
27
vidit
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.

9
Renan

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
5
shikos

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

1
Osy

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/

1
Duffmaster33
select max(dates)
from yourTable
group by dates
having count(status) > 1
0