2017-01-04 12 views
3

私はかなり新しいコーディングをしています。私はトランザクションテーブルから時間単位の金額を取得しようとしています。さまざまな時にデータを収集します。私は毎時キャッシャーIDごとの時間平均を取得し、時間の開始を示す出力を得たいと思います。さらに、私のテーブルはかなり大きいので、特定の日付の間だけ時間平均を取得しようとしています。ここに私のテーブルのスニペットがあります:時間単位の平均を取得する

  November Transactions  
Cash_ID Trans_Time   Amount 
1  11/01/16 12:00:00PM 5.08 
1  11/01/16 12:03:00PM 8.98 
2  11/01/16 12:05:00PM 38.53 
3  11/01/16 12:41:00PM 12.91 
1  11/01/16 12:11:00PM 14.55 
3  11/01/16 01:00:00PM 17.74 
2  11/01/16 12:45:00PM 21.33 
3  11/01/16 01:07:00PM 33.51 
2  11/01/16 12:15:00PM 15.86 

これは私が達成しようとしているものです。

trans_timeを時間単位でフィルタリングする方法を理解しましたが、平均を計算するのが難しいです。現在私が持っています

SELECT Cash_ID, Trans_Time, Amount 
FROM November Transactions 
WHERE Trans_Time between to_date('2016/11/01', 'yyyy/mm/dd hh:mi:ss')AND to_date('2016/11/02', 'yyyy/mm/dd hh:mi:ss') 
AND Trans_Time in 
(Select Trans_Time From November Transactions 
where Trans_Time = Trunc(Trans_Time,'hh')) 

私は他の質問に似ていましたが、それらはすべて時間値のカウント機能しか使用していませんでした。 select文でAmountの代わりにAVG(Amount)を試しましたが、 "single group group functionではありません"というエラーが出ました。私はおそらく別のインナーセレクトを考えていたが、条件がどうなるか把握できなかった。それが間違っている場合は、私がこれまでに持っているものを修正してください。ありがとう。

答えて

2

あなたは正しい軌道にいると思います。あなただけのロジックに右集約および他のいくつかの修正が必要になります。

SELECT Cash_ID, trunc(Trans_Time, 'hh'), AVG(Amount) 
FROM November_Transactions 
WHERE Trans_Time >= date '2016-11-01' and 
     Trans_Time < date '2016-11-02' 
GROUP BY Cash_ID, trunc(Trans_Time, 'hh') 
ORDER BY Cash_ID, trunc(Trans_Time, 'hh'); 

注:私は一日に真夜中に時間を含めるようにしたくないので、私は、betweenのためのロジックを変更しました。

+0

私のテーブルが将来拡張された場合でも、この解決策はまだ考えられますか?たとえば、私が選択していた列が増えても、その平均は必要ありませんでした。私は、 "単一グループのグループ機能ではない"と再び考えられると思いますか?大いに感謝しても、このソリューションの背後にあるコンセプトをもっと理解したり学びたいと思っています。 – JjKaf

+0

@vkp。 。 。修正していただきありがとうございます。 –

関連する問題