我们之前讲过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语言可能会略有差异。


原创文章,转载请务必注明出处并留下原文链接。

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注