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 - 滚动平均/总和的主要内容,如果未能解决你的问题,请参考以下文章

在 SQLite 中生成平均值

从 SQLite 中的所有行中减去平均值

如何滚动到 QTableView 中 Sqlite 模型的最后一行?

将行拆分为 m 个部分并构建每个部分的平均值 [SQLite]

在 sqlite 中按月分组

Android sqlite数据库-如何在滚动结束时显示列表视图添加 "加载更多项目"。