2017-11-13 30 views
0

私は時間と温度のテーブルを持っています - それらの時に取られたテーブル - 温度が変わるたびに行があります。私は温度の加重平均を求めます - 1時間1度、9時間2度の場合、加重平均温度は1.9度です。私は加重平均を計算する方法を知っています、そして、私はいくつかの選択についてもっと知っています...グループによって、そして私はこれができる方法だと思いますが、私はちょうど私が望むものを手に入れよう。sql時間加重平均

ここにいくつかのデータがあります...ご協力いただきありがとうございます。

create table dbo.Temps (EffectiveDateTime datetime2(7), Temp float) 

insert into dbo.Temps values('2017-04-25 13:51:45.2630000', 0.19) 

insert into dbo.Temps values('2017-04-25 14:13:24.1590000', 0.29) 

insert into dbo.Temps values('2017-04-25 14:53:10.2590000', 0.39) 

insert into dbo.Temps values('2017-04-25 13:46:27.0650000', 0.49) 

insert into dbo.Temps values('2017-04-25 14:10:50.2670000', 0.59) 

insert into dbo.Temps values('2017-04-25 14:48:10.7570000', 0.69) 

insert into dbo.Temps values('2017-04-25 14:04:42.9650000', 0.79) 

insert into dbo.Temps values('2017-04-25 14:27:59.5590000', 0.89) 

insert into dbo.Temps values('2017-04-25 14:56:38.8550000', 0.99) 

insert into dbo.Temps values('2017-04-25 14:08:11.8580000', 1.09) 

insert into dbo.Temps values('2017-04-25 14:33:39.4540000', 1.19) 
+0

このデータの予想される出力は? –

答えて

0

おそらく見ています彼らは時間の時間差を取得し、最終的には加重平均を計算し、それが最初に次の温度測定値を取得するためにLEAD使用

;with cte as 
(select *, lead(effectivedatetime) over (order by effectivedatetime) timelead 
from dbo.temps) 

,processed as 
(select *, datediff(mi,effectivedatetime,timelead)/cast(60 as decimal(10,2)) as hrdiff 
from cte) 

select sum(hrdiff*temp)/sum(hrdiff) 
from processed 

:このようなもので、SQL Serverのバージョンと仮定してLEAD機能をサポートしています。もちろん、上記の精度を調整する必要があります。あなたのケースで

SQLFiddle Demo

+0

ありがとう、私はこれが正確に私が必要と思った:) –

+0

素晴らしい!これで問題が解決した場合は、https://meta.stackexchangeに記載されている手順に従って受け付けてください。com/questions/5234/how-does-accepting-an-answer-work –

+0

他の人に興味がある場合には、次のものが含まれています –

0

最初に時間間隔があります。あなたは時間を言うが、私は、より正確なものにするために分を使用しています - あなたは、この設定を他の日付部分を変更することができます。

WITH DataSource AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY [EffectiveDateTime] ASC) AS [RowID] 
      ,* 
    FROM Temps 
) 
SELECT TS.[Temp] 
     ,DATEDIFF(MINUTE, TS.[EffectiveDateTime], TE.[EffectiveDateTime]) 
FROM DataSource TS 
INNER JOIN DataSource TE 
    ON TS.[RowID] = TE.[RowID] - 1; 

これは、特定の程度として何分一時あなたを与えるだろう。

enter image description here

最終クエリは、これがSUM(TEMP *分)値合計することと、すべての分にそれらを分けます:

WITH DataSource AS 
(
    SELECT ROW_NUMBER() OVER (ORDER BY [EffectiveDateTime] ASC) AS [RowID] 
      ,* 
    FROM Temps 
) 
SELECT SUM(TS.[Temp] * DATEDIFF(MINUTE, TS.[EffectiveDateTime], TE.[EffectiveDateTime]))/SUM(DATEDIFF(MINUTE, TS.[EffectiveDateTime], TE.[EffectiveDateTime])) 
FROM DataSource TS 
INNER JOIN DataSource TE 
    ON TS.[RowID] = TE.[RowID] - 1 
0

は、温度の加重平均は、 - それは時間のために1度、及び9時間2度であれば、加重平均温度が1.9度

これはだろう(あります1 x 1 + 2 * 9)/(1 + 9)= 1.9

別の表に期間を追加する列がある場合は、より良い/容易になります。温度の次の変化(持続時間)との時間差の計算を行うもう1つのテーブル。

次に、SQL文は次のようになります。

新しいテーブル名を、TempDurationとし、列名の長さと温度を指定しているとします。

select sum(TempDuration.temperature * TempDuration.duration)/sum(TempDuration.duration) 
from TempDuration 
  • 注:しないことにより、別のテーブルを持っている期間を計算し、SQLをより複雑にする多くのステップを必要としています。