2013-05-14 11 views
23

Sto cercando di ottenere l'ultimo record datetime da una tabella che si verifica per memorizzare più stati. Il mio tavolo si presenta in questo modo:SQL ottiene l'ultimo record dell'ora della data

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

I risultati dovrebbero essere

+---------+------------------------+-------+ 
|filename |Dates     |Status | 
+---------+------------------------+-------+ 
|abc.txt |2013-02-14 12:20:59.407 |Open | 
|dfg.txt |2013-02-14 12:20:59.407 |Open | 
+---------+------------------------+-------+ 
+6

quello RDBMS stai usando? – wootscootinboogie

risposta

22

Se si desidera una riga per ogni nome di file, che riflette una specifica Uniti e elencando la data più recente, questo è il tuo amico:

select filename , 
     status , 
     max_date = max(dates) 
from some_table t 
group by filename , status 
having status = '<your-desired-status-here>' 

Facile!

+0

Eventuali commenti sulle prestazioni? Supponiamo che abbia molti milioni di dischi in un modo ottimizzato per farlo, o dovrebbe prendere in considerazione l'idea di inserirlo in una nuova tabella degli ultimi record? – JPK

+0

Tutto dipende dagli indici sul tavolo. Devi esaminare il piano di esecuzione. Come regola generale: non ottimizzare fino a quando non si verifica un problema. È possibile inserire un trigger di inserimento/aggiornamento/eliminazione sulla tabella che manterrebbe una tabella di riepilogo con la data più recente per ogni combinazione di file/stato. Tuttavia, ciò ha implicazioni sulle prestazioni: ogni operazione di inserimento/aggiornamento/cancellazione nella tabella dei dettagli deve modificare la tabella di riepilogo. Aumenta anche la contesa nel DB (dal momento che ora blocchi due tabelle invece di una sola). Significa anche che ora hai due fonti di verità nel database. –

0
select max(dates) 
from yourTable 
group by dates 
having count(status) > 1 
23
SELECT * FROM table 
WHERE Dates IN (SELECT max(Dates) FROM table); 
+0

Come si tiene conto della parte di stati multipli della domanda? – wootscootinboogie

+0

In caso contrario, ottiene tutte le voci corrispondenti alla data massima. – vidit

+0

Ecco una demo - http://sqlfiddle.com/#!3/c94a2/1 – Taryn

1

esatta sintassi ovviamente dipende banca dati, ma qualcosa di simile:

SELECT * FROM my_table WHERE (filename, Dates) IN (SELECT filename, Max(Dates) FROM my_table GROUP BY filename) 

Questo ti darà resul esattamente ciò che stai chiedendo e mostrando sopra. Fiddle: http://www.sqlfiddle.com/#!2/3af8a/1/0

9
SELECT TOP 1 * FROM foo ORDER BY Dates DESC 

Restituirà un risultato con l'ultima data.

SELECT * FROM foo WHERE foo.Dates = (SELECT MAX(Dates) FROM foo) 

Restituirà tutti i risultati che hanno la stessa data massima, al millisecondo.

Questo è per SQL Server. Lascio a te la possibilità di utilizzare la funzione DATEPART se desideri utilizzare le date ma non le ore.

2

Considerando che max (date) possono essere diversi per ogni nome di file, la mia soluzione:

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

-2

Prova questo:

SELECT filename,Dates,Status 
FROM TableName 
WHERE Dates In (SELECT MAX(Dates) FROM TableName GROUP BY filename) 
+0

Questo potrebbe restituire date obsolete per alcuni nomi di file. – Vadzim

+0

Come, per favore spiega. – wara

2

questo lavoro

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 
+0

Questa è la funzione è fantastica, è possibile creare cicli ricorsivi per riempire i dati vuoti. –

+0

Da SQL Server 2012: https://docs.microsoft.com/en-us/sql/t-sql/functions/first-value-transact-sql – Vadzim