在这里插入图片描述

题目

我们有一个银行交易表,包含三列,user_id、存款或取款值(根据值是正数还是负数确定),以及每笔交易的 created_at 时间。计算存款的三天滚动平均值,并按日输出。

注意:请在输出中使用 '%Y-%m-%d' 的日期格式

示例:

输入:

bank_transactions

列名 类型
user_id 整数
created_at 日期时间
transaction_value 浮点数

输出:

列名 类型
dt 字符串
rolling_three_day 浮点数

提示:第三天的滚动三天平均值 = [第三天 + 第二天 + 第一天] / 3

答案

解题思路

题目只提供了交易数据,其中正数为存款,负数为取款记录,我们需要过滤出存款的记录。
其次,我们还需要计算每天的存款总额,然后再计算滚动三天平均值。

答案代码

SELECT 
    dt,
    AVG(transaction_value) OVER (ORDER BY dt ROWS BETWEEN 2 PRECEDING AND CURRENT ROW) AS rolling_three_day -- 滚动三天平均值
FROM 
    (select 
        DATE(created_at) AS dt, -- 提取日期
        SUM(transaction_value) AS transaction_value -- 计算每天的交易额总和
    FROM bank_transactions 
    WHERE 
        transaction_value > 0 -- 只考虑存款交易
    GROUP BY dt -- 按日期分组
    ORDER BY dt -- 按日期排序
    ) t -- 子查询别名为t

这段代码首先在子查询中计算每日的交易总和;接着,使用了窗口函数来计算每一天和前两天的存款或取款值的总和,然后除以3来得到滚动三天的平均值;最后,它将结果按照日期排序并输出。


SQL 滑动窗口函数:rows用法

<窗口函数>(<表达式>) OVER (
    [PARTITION BY <分区列名>]
    ORDER BY <排序列名>
    [ROWS BETWEEN <起始行偏移量> AND <结束行偏移量>]
)

ROWS: 表示按照行的范围进行定义框架,根据order by子句排序后,取的前N行及后N行的数据计算(与当前行的值无关,只与排序后的行号相关)。

常用:rows n perceding表示从当前行到前n行(一共n+1行)

边界可取值(Start expr & End expr) 说明
Current Row 当前行
N preceding 前 n 行,n 为数字, 比如 2 Preceding 表示前2行
unbounded preceding 开头
N following 后N行,n 为数字, 比如 2 following 表示后2行
unbounded following 结尾

示例:求按id号累计员工的薪资(rows 用法)
在这里插入图片描述

更多详细答案可关注公众号查阅。
在这里插入图片描述

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐