获得每小时平均值

Posted

技术标签:

【中文标题】获得每小时平均值【英文标题】:Getting Hourly Average 【发布时间】:2017-01-04 03:13:01 【问题描述】:

我对编码还很陌生,如果我能获得所有帮助,我将不胜感激。我正在尝试从我的交易表中获取每小时金额值。它在不同时间收集数据。我想获得每个收银员 ID 的每小时平均值,输出显示小时的开始。此外,我的表相当大,所以我试图只获得特定日期之间的每小时平均值。这是我的表的 sn-p:

         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

这就是我想要达到的目标。

    November Transactions       
Cash_ID  Trans_Time           Amount
1        11/01/16 12:00:00PM    9.54
2        11/01/16 12:00:00PM   25.24
3        11/01/16 12:00:00PM   12.91
3        11/01/16 01:00:00PM   25.63

我想出了如何按小时过滤 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 语句中尝试用 AVG(Amount) 代替 Amount,但出现“不是单组函数”错误。我在想也许是另一个内部选择,但无法弄清楚条件是什么。如果它也错了,请纠正我到目前为止的内容。谢谢。

【问题讨论】:

【参考方案1】:

我认为你是在正确的轨道上。您只需要对逻辑进行正确的聚合和其他一些修复:

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 的逻辑,因为我不想包含一天中午夜的时间。

【讨论】:

如果我的表将来扩展,这个解决方案是否仍然可行?例如,如果我最终选择了更多列并且我不需要这些平均值。我假设“不是单组功能”会再次出现?非常感谢您的帮助,但也希望尝试更好地理解/学习此解决方案背后的概念! @vkp 。 . .感谢您的修复。

以上是关于获得每小时平均值的主要内容,如果未能解决你的问题,请参考以下文章

如何获取具有多列的时间序列数据框中的每小时平均值

mysql查询每小时平均值

如何按小时汇总数据?

每小时时间序列上列的平均值

Mysql 每小时平均,间隔从半小时开始

计算由时间间隔分隔的连续每小时记录块的平均值