0

私はこのようなテーブルを持っています:

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
...

そして、私はこのテーブルを1時間ごとに更新する15000のモジュールを持っています。さらに、深夜にTotalPerDay値がリセットされます。

TotalPerDay与えられたのセットの最新の値を取得する必要があるクエリに苦労していますModuleID

GROUP BYで句を使ってみましたModuleIDTotalPerDayしかし、集計関数を使用せずに最新の値を取得するにはどうすればよいですか?

ちなみに、私はSQLServer2008を使用しています。

前もって感謝します!

4

2 に答える 2

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)
于 2012-08-07T23:31:45.387 に答える
1

私があなたの質問を正しく理解している場合、これはモジュールごとの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へのコメントに基づいて、モジュールごとの1日あたりの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)
于 2012-08-07T23:44:43.323 に答える