2012-08-07 81 views
0

的我有一个表是这样的:SQL Server查询检索最新记录一组给定的ID

ModuleID TimeStamp   Value TotalPerDay 
1   8/5/2012 9:00 PM 0.25  0.25 
2   8/5/2012 9:00 PM 0.15  0.15 
3   8/5/2012 9:00 PM 0  0 
4   8/5/2012 9:00 PM 1.25  1.25 
1   8/5/2012 10:00 PM 0.05  0.30 
3   8/5/2012 10:00 PM 0.89  0.89 
4   8/5/2012 10:00 PM 0.14  1.39 
4   8/5/2012 11:00 PM 0.70  2.09 
4   8/5/2012 12:00 PM 0.43  2.52 
... 

而且我有15000个模块更新此表每隔一小时。另外,在午夜,TotalPerDay值得到重置。

我正在努力处理一个查询,该查询应该为给定的一组ModuleID提供最新的TotalPerDay值。

我尝试使用上ModuleID一个GROUP BY条款。但是,如何在不使用聚合函数的情况下获取最新的TotalPerDay值?

顺便说一句,我使用的SQL Server提前2008

谢谢!

回答

1

如果我正确理解你的问题,那么这应该给你每天的最新总由模块(如果时间戳记是唯一的):

; with MyCte (moduleId, TimeStamp) 
AS(
    select moduleId, max(TimeStamp) 
    from modules 
    group by moduleId 
) 
select * from modules a 
join MyCte b 
on a.moduleId = b.moduleId 
    and a.TimeStamp = b.TimeStamp 

根据您对Gordon的意见,您正在寻找每个模块的SUM每日?如果是,那么在这里你去:

select ModuleId, 
     convert(varchar,cast(TimeStamp as datetime),101), 
     sum(totalPerDay) as GrandTotal 
from modules 
group by ModuleId, convert(varchar,cast(TimeStamp as datetime),101) 
+0

这正是我所需要的。谢谢。 – usp 2012-08-07 23:59:03

+0

嘿,我都尝试你的查询,它似乎像第二个作品比第一快!这是为什么? – usp 2012-08-08 16:40:29

+0

那么,它们是完全不同的;第一查询应该返回每个模块每天最后一个条目,由CTE(如一个子查询),并用加入选择的。第二个查询应返回每个模块每天所有总计的总和,并且只包含一个带有聚合的select语句。基本上,第一个查询更复杂,应该花费大约两倍的时间。 – 2012-08-08 18:58:47

1

所以,你要查询的是:

select moduleid, sum(value) as UpdatedTotalPerDay 
from t 
where moduleid in (. . .) 
group by moduleid 

有什么不对这个查询?如果你有一个关于moduleid的索引,那么性能应该很好。

如果这有历史,那么你可能还需要的条件

where cast(timestamp as date) = cast(getdate() as date) 
+0

SUM(值)将计算该模块自开始以来的VALUE的总和。我只需要一天。 – usp 2012-08-07 23:35:38

+0

然后使用WHERE子句只从今天获得的记录。 – 2012-08-07 23:36:42

+0

太棒了!我认为这应该工作。 – usp 2012-08-07 23:48:36