【数据分析面试】39.银行交易滚动平均值 (SQL:滑动窗口ROWS)
我们有一个银行交易表,包含三列,`user_id`、存款或取款值(根据值是正数还是负数确定),以及每笔交易的 `created_at` 时间。计算存款的三天滚动平均值,并按日输出。
·

题目
我们有一个银行交易表,包含三列,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 用法)
更多详细答案可关注公众号查阅。
更多推荐

所有评论(0)