如何计算列值必须> 1的列的实际平均值。 postgresql中平均值的25%以上

时间:2014-04-05 07:41:59

标签: sql postgresql-9.2

我在PostgreSQL 9.2表格中获得了包含数百万行的1年数据,而且我正在努力计算用于网络统计的一项指标。

I have a table with columns date , devicename , traffic_rate

我需要找到不包括假期的平均traffic_rate。如果是traffic_rate is < 25% of average(traffic_rate),则会将某一天视为假日。再次,我需要通过排除假期并查找实际平均值来对traffic_rate求和。 例如:

date  devicename    traffic_rate
day1  gateway1        45.3
day2  gateway1        1
day3  gateway1        28.2
day4  gateway1        4.56

平均值包括holidays = (45.3+1+28.2+4.56)/4 = 19.76 traffic_rate < 25 % of 19.76 will be treated as holiday --> Here day2,day4天被视为假期

排除holidays = (45.3+28.2)/2 = 36.75

的原始流量费率

我如何在postgresql查询中实现它?

任何帮助都会非常值得关注

3 个答案:

答案 0 :(得分:2)

您可以先使用common table expression选择全局平均值,然后使用此值过滤实际查询的表格:

WITH glob AS ( SELECT 0.25 * AVG( traffic_rate ) as reducedAverage FROM yourTab )
SELECT AVG( yourTab.traffic_rate )
FROM yourTab
INNER JOIN glob
  ON yourTab.traffic_rate >= glob.reducedAverage

Example Fiddle

答案 1 :(得分:1)

试试这个:

SELECT 
    AVG(traffic_rate) 
FROM traffic_tbl
WHERE traffic_rate > (SELECT 0.25 * AVG(traffic_rate) FROM traffic_tbl)

答案 2 :(得分:0)

这是另一种方法:

SELECT
  AVG(traffic_rate)
FROM
(
  SELECT
    traffic_rate,
    AVG(traffic_rate) OVER () AS avg_traffic_rate
  FROM atable
) AS s
WHERE traffic_rate < 0.25 * avg_traffic_rate
;

此解决方案使用window aggregationAVGOVER子句)。 s派生表包含单个traffic_rate值以及从整个表中计算出的平均值。然后,主查询使用平均值根据需求过滤掉行,并根据剩余值计算最终平均值。