按月查询获取前n个月的平均值

Posted

技术标签:

【中文标题】按月查询获取前n个月的平均值【英文标题】:Get avareage of n previous months by month query 【发布时间】:2018-02-19 18:19:22 【问题描述】:

我正在做一个查询,获取 2 列的计数和另一列的总和,从过去 13 个月的日期列按月份分组。这是我的查询:

SELECT  TO_CHAR(colDate,'yyyy_MM') as month ,
        COUNT(DISTINCT col1) AS col1,
        COUNT(DISTINCT col2) as col2,
        SUM(col3) as col3 
FROM myTable
WHERE TO_CHAR(colDate,'yyyy_MM') IN (select distinct TO_CHAR(colDate,'yyyy_MM')
                                     from myTable
                                     order by  1 desc
                                     limit 13)
GROUP BY 1

问题是对于每个月,我还需要前3个月的平均值:

COUNT(DISTINCT col1) AS col1, COUNT(DISTINCT col2) 作为 col2, SUM(col3) as col3

所以我的查询需要是这样的:

SELECT  TO_CHAR(colDate,'yyyy_MM') as month ,
            COUNT(DISTINCT col1) AS col1,
            COUNT(DISTINCT col2) as col2,
            SUM(col3) as col3,
            ... as PreviousMonthsAvgCol1,
            ... as PreviousMonthsAvgCol2,
            ... as PreviousMonthsAvgCol3
    FROM myTable
    WHERE TO_CHAR(colDate,'yyyy_MM') IN (select distinct TO_CHAR(colDate,'yyyy_MM')
                                         from myTable
                                         order by  1 desc
                                         limit 13)
    GROUP BY 1

第一个月之前的月份仍需计入第一个月的平均值。

【问题讨论】:

结果集中的第一个月怎么样? 不确定您是否使用 MS SQL Server,但您是否考虑过创建 UDF(用户定义函数)来接受参数以计算特定时间跨度的平均值?对于较大的数据集,这可能会导致性能滞后,但可能值得考虑。 第一次之前的月份需要计入平均值。 我想我会让我的查询得到 16 个月并计算我的应用程序中的所有内容。 【参考方案1】:

如果您不需要 13 个月之前的数据,只需使用 lag()

SELECT . . .,
       LAG(COUNT(DISTINCT col1)) OVER (ORDER BY MIN(colDate)) as prev_col1,
   . . . 
FROM myTable . . .;

如果您确实需要更早的数据,则进行完整聚合然后选择 13 个月。

【讨论】:

【参考方案2】:

同意,Gordon Lindoff 的回答。

但是,我建议不要在日期范围谓词中使用TO_CHAR()。这将迫使 Redshift 扫描不必要的数据。

如果您必须将日期四舍五入到整月,请尝试使用colDate BETWEEN '2017-01-01' and '2018-01-31'DATE_TRUNC()

【讨论】:

以上是关于按月查询获取前n个月的平均值的主要内容,如果未能解决你的问题,请参考以下文章

PowerBI DAX计算:按月的移动平均线组计算

如何找到滚动的 3 个月方差?

获取按月分组的最近 12 个月的数据,即使为 0

如何获得最近 4 个月的平均值

MySQL 获取按月分组的过去 12 个月的数量

计算每个月过去 12 个月的平均值?