【问题标题】:Get avareage of n previous months by month query按月查询获取前n个月的平均值
【发布时间】: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 个月并计算我的应用程序中的所有内容。

标签: sql amazon-redshift


【解决方案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()

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-04-04
      • 1970-01-01
      相关资源
      最近更新 更多