按月查询获取前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个月的平均值的主要内容,如果未能解决你的问题,请参考以下文章