2015-01-15 62 views
0

我已经做了一些研究,但发现了一些似乎并不需要的示例。我的表结构是这样的:基于最新时间戳的MSSQL选择

Hostname Filename Timestamp 

Host1  ***.exe  2014-09-09 12:01:45.000 
Host1  ***.pdf  2014-08-09 12:01:45.000 
Host1  ***.ide  2014-07-09 12:09:44.000 
Host1  ***.ide  2014-12-31 12:00:00.000 
Host2  ***.exe  2014-09-09 12:01:45.000 
Host2  ***.pdf  2014-08-09 12:01:45.000 
Host2  ***.ide  2014-07-08 12:09:44.000 
Host2  ***.ide  2014-12-29 12:00:00.000 

有几百个主机,每个主机有几十万个文件。我试图得到的是每个主机上的一个.IDE文件 - 无论哪个都有最新的时间戳。因此,在这种情况下,我想回:

Host2  ***.ide  2014-12-29 12:00:00.000 
Host1  ***.ide  2014-12-31 12:00:00.000 

我曾尝试以下,但它似乎并没有被我想要什么,我不能完全弄清楚为什么,我知道这是错的:

select hostname, filename, max(timestamp) as timestamp from TABLE where 
filename like '%.ide%' 
group by hostname,filename 

任何帮助,将不胜感激!

+0

子查询你为什么用 – 2015-01-15 17:32:39

回答

0

我相信这会工作:

select t.* 
from table t 
join (
    -- gets the maximum timestamp per hostname for "ide" 
    SELECT max(Timestamp) as maxTime, hostname 
    from table 
    where filename like '%.ide%' 
    group by hostname 
) s on t.hostname = s.hostname 
    and t.timestamp = s.maxTime 
where t.filename like '%.ide%' 

基本上它的选择*从您的主表,其中记录可以成功地加入了识别每个主机的最大时间戳“IDE”

+0

这个群好吧,我会试试这个。我实际上有点撒谎,桌子上还有更多的领域并不重要。所以对于原来的线我可以做:选择t.hostname,t.filename,t.timestamp而不是t。*? – DJMcCarthy12 2015-01-15 17:56:58