我在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查询中实现它?
任何帮助都会非常值得关注
答案 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
答案 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 aggregation(AVG
和OVER
子句)。 s
派生表包含单个traffic_rate
值以及从整个表中计算出的平均值。然后,主查询使用平均值根据需求过滤掉行,并根据剩余值计算最终平均值。