2012-08-07 102 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