银行账户每笔交易后余额计算及多日购买用户数统计的SQL实现问询
两个SQL需求的解决方案
我来帮你搞定这两个SQL查询问题,直接上可运行的代码和对应的解释:
问题1:计算每个账户每笔交易后的剩余余额
需求说明
给定Bank_Transaction表,需要计算每个账户每完成一笔交易后的实时剩余余额,余额是该账户所有历史交易(包括当前这笔)的累计金额。
SQL查询语句
SELECT account_number, transaction_date, transaction_amount, SUM(transaction_amount) OVER ( PARTITION BY account_number ORDER BY transaction_date ) AS remaining_balance FROM Bank_Transaction ORDER BY account_number, transaction_date;
代码解释
PARTITION BY account_number:将数据按账户分组,确保我们只在同一个账户内计算累计余额,不会和其他账户的交易混淆。ORDER BY transaction_date:保证交易按发生时间顺序累加,毕竟余额必须按照交易的先后顺序计算才准确。SUM(transaction_amount) OVER (...):窗口函数会对每个账户内的交易按时间顺序做累计求和,每一行的结果就是该笔交易完成后的账户余额。
问题2:统计存在多日购买行为的用户数量
需求说明
给定Transaction表,需要统计至少在2个不同日期有过购买行为的用户数量(同一用户单日购买多款产品只算1天)。
SQL查询语句
SELECT COUNT(User_id) AS multi_day_users FROM ( SELECT User_id, COUNT(DISTINCT transaction_date) AS purchase_days FROM Transaction GROUP BY User_id ) AS user_purchase_summary WHERE purchase_days >= 2;
代码解释
- 内层子查询:
- 按
User_id分组,用COUNT(DISTINCT transaction_date)统计每个用户的唯一购买天数(自动排除了同一用户单日多次购买的重复统计)。
- 按
- 外层查询:
- 筛选出购买天数≥2的用户,然后用
COUNT(User_id)统计这些用户的总数,就是我们要的结果。
- 筛选出购买天数≥2的用户,然后用
如果你想用CTE(公共表表达式)让代码更易读,也可以写成这样:
WITH user_purchase_dates AS ( SELECT DISTINCT User_id, transaction_date FROM Transaction ) SELECT COUNT(DISTINCT User_id) AS multi_day_users FROM user_purchase_dates GROUP BY User_id HAVING COUNT(transaction_date) >= 2;
内容的提问来源于stack exchange,提问作者P Niharika
相关产品推荐
相关产品推荐

