2011-01-20 78 views
12

我已经做了一些寻找,似乎无法获得我期待的结果。基本上我们公司有四种不同的管理系统,我正在定期组合来自每个系统的所有数据。我的目标是每小时将数据更新到中央数据库。下面是一个简单的数据集,我有工作:从数据库检索每个组中的最后一条记录 - SQL Server 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函数实际上按我需要的方式工作,只为每个GROUP BY返回一条记录,但在SQL Server中不起作用。

我想我需要使用MAX和左加入,但我迄今为止的尝试都失败了。

您的帮助将不胜感激。在过去的3-4个小时里,我一直在努力争取一个正在运行的查询。此主表位于SQL Server 2005服务器上。

谢谢!

回答

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

乔,工作很好。我从来不知道WITH子句,从来没有使用OVER或PARTITION。你能简单地告诉我他们在做什么吗?我查看了他们,但现在确定我找到了正确的信息。 – RyanF 2011-01-20 20:24:01

相关问题