2017-07-20 8 views
1

Here is the snip of my database過去3日間の平均エネルギー消費量を正確な時間で計算したいと考えています。だから私は24.10.2016で消費している場合。 10時間前、私は同じ時間に最後の3日間の平均消費量の列を追加したいと思います。したがって、23.10.2016。 10h、22.10.2016。 10hおよび21.10.2016。 10h。私の記録は1時間ごとに測定されるので、この平均を計算するには、を24行目ごとに見てを探してください。何も見つかりませんでした。クエリを変更して、必要なものを取得するにはどうすればよいですか?sqlのn番目の行(24番目、48番目、72番目など)ごとに移動平均値を計算するにはどうすればよいですか?

select avg(consumption) over (order by entry_date rows between 72 
    preceding and 24 preceding) from my_data; 

または別の方法がありますか?

+1

plz show table structure – Shibon

+0

ご質問に該当しないタグは使用しないでください。実際に使用しているデータベースが不明なため、データベースタグを削除しました。実際に使用しているデータベースの* only *タグを追加してください。 –

+1

私は時間のフィルタリングがより安全で簡単になると思います。 '..DATEPART(HOUR、entry_date)= @ hour'あなたのデータに隙間がある場合(またはデータを複製する場合)、n番目のレコードがすべて落ちます – JeffUK

答えて

1

にしている場合はたぶん、この1試してみてください。

select entry_date, EXTRACT(HOUR FROM entry_date), 
    avg(consumption) over (PARTITION BY EXTRACT(HOUR FROM entry_date) 
     order by entry_date rows between 72 preceding and 24 preceding) 
from my_data; 

を、あなたがRANGE BETWEEN INTERVAL '72' HOUR PRECEDING AND INTERVAL '24' HOUR PRECEDING代わりのROWSを使用することができます。これは、ギャップや時間値が重複した場合の状況をカバーします。

+0

確かに 'RANGE'仕様が優れています。いずれにせよ、これは最適な答えだと思います。 – mathguy

+0

@Wernfried Domscheitありがとう、これは私が必要なものです。 :) –

0

私はフィルタを使ってこのやり方をすることができると思います。

Select avg(consumption) from my_data 
where 
    entry_date between @StartDate and @EndDate 
and datepart(HOUR, entry_date)[email protected] 

あなたはMySQLの

Select avg(consumption) from my_data 
where 
    entry_date between @StartDate and @EndDate 
and HOUR(entry_date)[email protected] 
関連する問題