SQLite - 滚动平均/总和
Posted
技术标签:
【中文标题】SQLite - 滚动平均/总和【英文标题】:SQLite - Rolling Average/Sum 【发布时间】:2020-07-26 19:53:06 【问题描述】:我有一个如下所示的数据集,想知道如何对其当前记录和接下来的两条记录进行滚动平均。示例:让我们考虑第一个记录,其总数为 3,然后是 4 和 7,现在第一个记录的滚动 3 天平均值将是 4.6,依此类推。
Date Total
1 3
2 4
3 7
4 1
5 2
6 4
预期输出:
Date Total 3day_rolling_Avg
1 3 4.6
2 4 4
3 7 3.3
4 1 2.3
5 2 null
6 4 null
PS:拥有“null”值并不重要。这只是一个样本数据,我需要查看超过 3 天(例如:30 天滚动)
【问题讨论】:
继续。尝试一下 @Harish 您是否有理由接受未提供预期结果的答案? db-fiddle.com/f/d5DhWGhjDXP9rigmHVRmiU/0 和 db-fiddle.com/f/eLoCBPycVWBsZ3nHWPVX81/0 @forpas 第一种方法更准确,除了处理 "null" ,当有很多记录时更容易实现,特别是滚动天数超过 3 天(例如:30 天) 除了处理“null”,但要求是返回空值。所以我的问题是,你为什么接受一个 not 如你所要求的那样返回空值的答案。另外,您在问题中的什么地方提到您可以使用代码来滚动平均长达 30 天? @forpas 抱歉,我应该很清楚我的问题。我将编辑我的问题以使其更有意义 【参考方案1】:我认为最简单的方法是一个窗口avg()
,带有poper窗口框架:
select
t.*,
avg(total)
over(order by date rows between current row and 2 following) as "3d_rolling_avg"
from mytable t
如果您想在少于 2 个前导行时返回 null
值,如预期结果所示,那么您可以在其顶部使用 row_number()
:
select
t.*,
case when rank() over(order by date desc) <= 2
then avg(total)
over(order by date rows between current row and 2 following)
end as "3d_rolling_avg"
from mytable t
【讨论】:
以上是关于SQLite - 滚动平均/总和的主要内容,如果未能解决你的问题,请参考以下文章
如何滚动到 QTableView 中 Sqlite 模型的最后一行?