簡體   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