如何获取客户总余额为0的所有日期?SQL技术问询
解决多客户总余额变为0的日期查询问题
需求分析
我们需要从存储多客户多账户每日余额的表中,找出每个客户所有账户总余额为0的日期(若需筛选“从非0转为0”的日期,可调整条件)。原SQL仅针对单个账户余额变0的场景,无法满足按客户汇总的需求。
解决方案
步骤1:按客户+日期汇总总余额
先对每个客户的每日所有账户余额求和,得到该客户当日的总余额。
步骤2:判断总余额变化状态(可选)
如果需要筛选“从非0状态转为0”的日期,使用LAG窗口函数获取该客户前一天的总余额,再对比当日和前日的总余额。
完整SQL代码
WITH customer_daily_total AS ( -- 计算每个客户每日的总余额 SELECT customer, date, SUM(balance) AS total_balance FROM your_table_name -- 替换为实际表名 GROUP BY customer, date ORDER BY customer, date ), balance_change AS ( -- 获取前一天的总余额,用于判断余额变化状态 SELECT customer, date, total_balance, LAG(total_balance) OVER (PARTITION BY customer ORDER BY date) AS prev_total_balance FROM customer_daily_total ) -- 筛选总余额为0的日期,若需仅保留"从非0转为0"的日期,添加AND prev_total_balance > 0 SELECT customer, date FROM balance_change WHERE total_balance = 0 -- AND prev_total_balance > 0; -- 如需筛选首次变0/从非0转0的日期,取消注释该行 ORDER BY customer, date;
代码说明
customer_daily_totalCTE:按客户和日期分组,汇总当日所有账户的余额总和,得到每个客户每天的总余额。balance_changeCTE:使用LAG函数按客户分区、日期排序,获取该客户前一天的总余额,用于判断余额变化状态。- 最终查询:筛选总余额为0的日期;如果只需要“从非0转为0”的日期,取消注释
AND prev_total_balance > 0条件即可。
内容的提问来源于stack exchange,提问作者Programmer
相关产品推荐
相关产品推荐

