为了账号安全,请及时绑定邮箱和手机立即绑定

从数据库中检索每个组中的最后记录-SQLServer 2005/2008

从数据库中检索每个组中的最后记录-SQLServer 2005/2008

慕哥9229398 2019-07-26 15:14:35
从数据库中检索每个组中的最后记录-SQLServer 2005/2008我做了一些苦差事,似乎得不到我想要的结果。基本上,我们在整个公司都有四个不同的管理系统,我正在定期合并来自每个系统的所有数据。我的目标是每小时更新数据到一个中央数据库。下面是我正在使用的一个示例数据集:COMPUTERNAME | SERIALNUMBER | USERNAME | LASTIP | LASTUPDATE | SOURCE TEST1 | 1111 | BOB | 1.1.1.1 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST1 | 1111 | BOB | 1.1.1.1 | 1/18/2011 01:00:00 | MGMT_SYSTEM_2 TEST1 | 1111 | PETER | 1.1.1.11 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST2 | 2222 | GEORGE | 1.1.1.2 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST3 | 3333 | TOM | 1.1.1.3 | 1/19/2011 01:00:00 | MGMT_SYSTEM_2 TEST4 | 4444 | MIKE   | 1.1.1.4 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST4 | 4444 | MIKE   | 1.1.1.41 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST5 | 5555 | SUSIE  | 1.1.1.5 | 1/19/2011 01:00:00 | MGMT_SYSTEM_1因此,我想查询这个主表,并且只检索最新的记录(基于LASTUPDATE),这样我就可以获得关于该系统的最新信息。问题是,每个数据库中可能都有一个系统,但它们当然永远不会有相同的确切更新时间。我希望能得到这样的东西:TEST1 | 1111 | PETER | 1.1.1.11 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST2 | 2222 | GEORGE | 1.1.1.2 | 1/17/2011 01:00:00 | MGMT_SYSTEM_1 TEST3 | 3333 | TOM | 1.1.1.3 | 1/19/2011 01:00:00 | MGMT_SYSTEM_2 TEST4 | 4444 | MIKE   | 1.1.1.41 | 1/19/2011 01:00:00 | MGMT_SYSTEM_3 TEST5 | 5555 | SUSIE  | 1.1.1.5 | 1/19/2011 01:00:00 | MGMT_SYSTEM_1我试过使用MAX函数,但是我只能检索一个列。我不能在子查询中使用这一点,因为我没有一个唯一的ID字段,可以为我提供最后更新的记录。其中一个系统是MySQL数据库,MySQL中的MAX函数实际上按照我需要的方式工作,每个组只返回一条记录,但它在SQLServer中不起作用。我认为我需要使用MAX和左加入,但我的尝试到目前为止都失败了。你的帮助将不胜感激。在过去的3-4个小时里,我一直在绞尽脑汁想得到一个有用的查询。此主表位于SQLServer 2005服务器上。谢谢!
查看完整描述

3 回答

?
慕森王

TA贡献1777条经验 获得超3个赞

;with cteRowNumber as (
    select COMPUTERNAME, SERIALNUMBER, USERNAME, LASTIP, LASTUPDATE, SOURCE,
           row_number() over(partition by COMPUTERNAME order by LASTUPDATE desc) as RowNum     
              from YourTable)select COMPUTERNAME, SERIALNUMBER, USERNAME, LASTIP, LASTUPDATE, SOURCE  
                from cteRowNumber    where RowNum = 1




查看完整回答
反对 回复 2019-07-27
?
三国纷争

TA贡献1804条经验 获得超7个赞

在SQLServer中,最具表现力的解决方案通常是关联子查询:

select t.*from twhere t.lastupdate = (select max(t2.lastupdate)
                      from t t2                   
                         where t2.computername = t.computername       
                                       );

尤其是,这可以利用(computername, lastupdate)..从概念上讲,这比row_number()因为这个查询只是过滤掉不匹配的行。这个row_number()版本需要将行号附加到所有行,然后再进行筛选-这是更多的数据处理。




查看完整回答
反对 回复 2019-07-27
  • 3 回答
  • 0 关注
  • 399 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信