SQL窗口函数之求前N行平均值
我们之前讲过SQL窗口函数的应用,今天笔者正好遇到一个较为特殊的应用,也在这里总结分享给大家。我们每天都要出日报,会发完整的Excel报表,但为了更方便领导在通讯工具上一眼看到今天的数,并且为了有对比有感知,我们还会将当天数据以及前N天平均值单独发出来,比如将下图这样精简的数据截个图发出来,这样更方便领导看数。那 SQL前N行平均值 具体如何实现呢,这就需要应用窗口函数了。
我们先来重温一下Presto SQL窗口函数完整的定义:
function(args) OVER ( [PARTITION BY expression] [ORDER BY expression [ASC|DESC]] [frame] ) A frame is one of: {RANGE|ROWS} frame_start {RANGE|ROWS} BETWEEN frame_start AND frame_end frame_start and frame_end can be any of: UNBOUNDED PRECEDING expression PRECEDING -- only allowed in ROWS mode CURRENT ROW expression FOLLOWING -- only allowed in ROWS mode UNBOUNDED FOLLOWING
对着窗口函数的定义,我们能够看出通过对 [frame] 的条件声明,我们可以灵活设置计算范围。假设我们已有如下 按日期汇总后的结果数据 table1,我们要计算每日前7天均值:
示例代码:
select date as "日期", '销售金额' as "指标", amount as "当天", lag(amount, 7) over (order by date) as "对应上周", avg(amount) over (order by date rows between 7 preceding and 1 preceding) as "前7天均值" from table1
代码结果:
以上就是 SQL前N行平均值 的代码实现过程,我们也可以计算前N行合计值、前N行最大值最小值等,具体看我们的需求,核心是对窗口函数的理解和应用。代码以Presto SQL实现,其他SQL语言可能会略有差异。
原创文章,转载请务必注明出处并留下原文链接。