繁体   English   中英

在PostgreSQL中,如何计算其列值必须大于平均值的25%的列的实际平均值

[英]How to calculate actual average of a column whose column values need to be > than 25% of average in postgresql

我在PostgreSQL 9.2表中有100万行的一年数据,而我正努力计算一种用于网络统计的度量。

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在内的平均值holidays = (45.3+1+28.2+4.56)/4 = 19.76traffic_rate < 25 % of 19.76 will be treated as holiday --> Here day2,day4traffic_rate < 25 % of 19.76 will be treated as holiday --> Here day2,day4被视为假期

不含holidays = (45.3+28.2)/2 = 36.75原始流量率holidays = (45.3+28.2)/2 = 36.75

如何在Postgresql查询中实现呢?

任何帮助将是非常可贵的

您可以使用公用表表达式首先选择全局平均值,然后使用此值为实际查询过滤表:

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

小提琴的例子

尝试这个:

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

这是另一种方法:

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
;

此解决方案使用窗口聚合 (带有OVER子句的AVG )。 s派生表包含个别traffic_rate值连同关闭整个表中计算出的平均值。 然后,主要查询将使用平均值根据需求过滤掉行,并根据剩余值计算最终平均值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM