【问题标题】:MSSQL select based on most recent timestamp基于最近时间戳的 MSSQL 选择
【发布时间】:2015-03-14 04:45:38
【问题描述】:

我进行了一些研究,但发现了一些似乎不是我需要的示例。我的表结构是这样的:

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

任何帮助将不胜感激!

【问题讨论】:

  • 为什么要使用group by

标签: sql-server timestamp


【解决方案1】:

我相信这会奏效:

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”的每个主机名的最大时间戳

【讨论】:

  • 好的,我会试试这个。我实际上有点撒谎,表中还有更多无关紧要的字段。所以对于原始行我可以这样做:选择 t.hostname, t.filename, t.timestamp 而不是 t.*?
猜你喜欢
  • 2020-01-29
  • 2021-10-02
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 2013-08-10
  • 2013-03-31
  • 1970-01-01
相关资源
最近更新 更多