2017-11-13 3 views
0

시간과 온도의 테이블을 가지고 있습니다 - 온도가 바뀔 때마다 행이 있습니다. 나는 온도의 가중 평균을 원합니다 - 1 시간 동안 1도, 9 시간 동안 2 도인 경우, 가중 평균 온도는 1.9도입니다. 나는 가중치 평균을 계산하는 방법을 안다. 나는 그룹에 의한 선택 ... over ... order by ...에 관해서 약간 알고있다. 나는 이것이 어떻게 행해질 수 있는지 생각하지만, 어떻게해야 하는지를 알 수 없다. 내가 원하는 것을 얻으십시오.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 값 합계하는 모든 분에게 나누어됩니다

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

다른 테이블에 기간 추가 열이 있으면 더 좋거나 더 쉬울 것입니다. 즉, 다음의 온도 변화 (시간)와의 시간차를 계산하기위한 또 하나의 테이블이다.

그러면 SQL 문은 다음과 같습니다.

새 테이블 이름이 지속 기간 및 온도가 열 이름 인 TempDuration이라고 가정합니다.

select sum(TempDuration.temperature * TempDuration.duration)/sum(TempDuration.duration) 
from TempDuration 
  • : 다른 테이블을 가지고 있지함으로써이 기간을 계산하고 SQL이 더 복잡하게 많은 단계가 필요합니다.