消除最低2个值的滚动平均值的功能?

Posted

技术标签:

【中文标题】消除最低2个值的滚动平均值的功能?【英文标题】:Function to get rolling average with lowest 2 values eliminated? 【发布时间】:2020-08-12 02:27:12 【问题描述】:

这是我希望输出的 current_Rating 列的示例数据。


Date         Name    Subject         Importance    Location     Time      Rating  Current_rating
12/08/2020   David   Work            1             London       -         -       4
1/08/2020    David   Work            3             London       23.50     4       3.66
2/10/2019    David   Emails          3             New York     18.20     3       4.33
2/08/2019    David   Emails          3             Paris        18.58     4       4
11/07/2019   David   Work            1             London       -         3       4
1/06/2019    David   Work            3             London       23.50     4       4
2/04/2019    David   Emails          3             New York     18.20     3       5
2/03/2019    David   Emails          3             Paris        18.58     5       -
12/08/2020   George  Updates         2             New York     -         -       2
1/08/2019    George  New Appointments5             London       55.10     2       -

我需要使用一个函数来获取 current_Rating 列中的值。current_Rating 从每个名称的 rating 列中获取前 5 个结果,然后消除最低的 2 个结果,然后获取剩余 3 个的平均值。还有一些名称可能没有 5 个结果,所以如果 3 个或以下,我只需要获得结果的平均值,如果 4 个结果我需要消除最低值并对剩余的 3 个进行平均。还要获得正确的 5 个以前的结果需要按日期排序。这可能吗?提前感谢您的时间。

【问题讨论】:

听起来你需要创建一个自定义的aggregate function。 您只需要前 3 个值的平均数吗?你需要函数来得到这个结果吗?您只需要一个名称或全部名称的平均结果吗?有很多不清楚的地方。 @Abdusoli 对不起,如果我不清楚。它需要是过去 5 个结果中最高 3 个数字的平均值。它需要一个函数来获取每个条目这个滚动平均值。如果该名称没有以前的会议,则它将返回 null。 【参考方案1】:

多么痛苦!我认为最简单的方法可能是使用数组,然后使用unnest() 和聚合:

select t.*, r.current_rating
from (select t.*,
             array_agg(rating) over (partition by name order by date rows between 4 preceding and current row) as rating_5
      from t
     ) t cross join lateral
     (select avg(r) as current_rating
      from (select u.*
            from unnest(t.rating_5) with ordinality u(r, n)
            where r is not null
            order by r desc desc
            limit 3
           ) r
     ) r

【讨论】:

再次感谢您的时间,戈登。它几乎可以完美运行,我们已经接近了。这将创建 3 个列,其中一个是 rating_5,其中包含最新的 5 个评级,按预期工作,然后它创建 2 个相同的 current_rating 列。问题在于它获取最后 5 个的平均值,而不是消除最低的 2 个值。 @undecided000 。 . .呃。最里面的子查询应该有limit 3(它现在有)。这就是order by 的重点。 感谢您的编辑,但现在限制 3 意味着它只计算最后 3 个值的平均值? @undecided000 。 . .我确定了订单。是现在的三个最高值。 @undecided000 。 . .你问有趣的问题。

以上是关于消除最低2个值的滚动平均值的功能?的主要内容,如果未能解决你的问题,请参考以下文章

Gym - 102500E - Expeditious Cubing(基础数学)

计算向量中每 n 个值的平均值

使用最后 n 个值的平均值或中值填充数据框不同列中的缺失值

Python-表示一列的每n个值

zabbix 怎么对key值求平均值

查找字典中最大 4 个值的键