消除最低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个值的滚动平均值的功能?的主要内容,如果未能解决你的问题,请参考以下文章