SQL Server查询检索最新记录一组给定的ID
问题描述:
的我有一个表是这样的: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
谢谢!
答
如果我正确理解你的问题,那么这应该给你每天的最新总由模块(如果时间戳记是唯一的):
; 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)
答
所以,你要查询的是:
select moduleid, sum(value) as UpdatedTotalPerDay
from t
where moduleid in (. . .)
group by moduleid
有什么不对这个查询?如果你有一个关于moduleid的索引,那么性能应该很好。
如果这有历史,那么你可能还需要的条件
where cast(timestamp as date) = cast(getdate() as date)
这正是我所需要的。谢谢。 – usp 2012-08-07 23:59:03
嘿,我都尝试你的查询,它似乎像第二个作品比第一快!这是为什么? – usp 2012-08-08 16:40:29
那么,它们是完全不同的;第一查询应该返回每个模块每天最后一个条目,由CTE(如一个子查询),并用加入选择的。第二个查询应返回每个模块每天所有总计的总和,并且只包含一个带有聚合的select语句。基本上,第一个查询更复杂,应该花费大约两倍的时间。 – 2012-08-08 18:58:47