银行数据库SQL查询需求:按支行获取储蓄账户最高余额(一行/支行)
搞定支行储蓄账户最高余额的唯一展示问题
嘿,我来帮你解决这个查询问题!你的核心需求是每个支行(唯一bid)只显示一行,对应它的储蓄账户最高余额,对吧?看你给出的未完成查询,问题主要出在没按支行ID分组,而且直接关联客户表的话,还得注意怎么匹配到最高余额对应的客户,不然很容易出现重复行或者报错。
先搞基础版:只看支行ID和最高余额
如果只需要支行ID和它的最高储蓄余额,这写法最简单,直接用GROUP BY按bid分组就行:
SELECT MAX(a.balance) AS highest_balance, b.bid FROM brancht b JOIN accountt a ON b.bid = a.bid -- 要是你的账户表有类型区分(比如储蓄/活期),记得加这句过滤储蓄账户 -- WHERE a.account_type = '储蓄' GROUP BY b.bid;
这样每个bid绝对只会显示一行,就是该支行的最高余额。
进阶版:同时显示最高余额的客户信息
如果还得把持有这个最高余额的客户信息也展示出来,就不能直接在GROUP BY里加客户列(毕竟一个支行可能有好几个客户,只有余额最高的那个才是我们要的)。这里给你两种写法:
方法一:子查询匹配最高余额
先查每个支行的最高余额,再关联回账户和客户表找对应记录:
SELECT a.balance AS highest_balance, b.bid, c.pname.firstname, c.pname.middleinitial, c.pname.lastname FROM brancht b JOIN accountt a ON b.bid = a.bid JOIN customeraccount c ON a.account_id = c.account_id -- 这里假设账户和客户用account_id关联,你根据实际表结构调整 WHERE (a.bid, a.balance) IN ( SELECT bid, MAX(balance) FROM accountt -- 同样,要过滤储蓄账户就加这句:WHERE account_type = '储蓄' GROUP BY bid );
不过要注意,如果一个支行有多个账户余额都是最高值(比如两个客户都存了100万,都是支行第一),这个查询会返回多行。要是你想强制每个支行只显示一行,就用下面的窗口函数写法。
方法二:窗口函数排名取第一
用ROW_NUMBER()给每个支行的账户按余额降序排个名,取排名第一的那条:
WITH ranked_accounts AS ( SELECT a.balance, b.bid, c.pname.firstname, c.pname.middleinitial, c.pname.lastname, -- 按支行分组,余额从高到低排名 ROW_NUMBER() OVER (PARTITION BY b.bid ORDER BY a.balance DESC) AS rn FROM brancht b JOIN accountt a ON b.bid = a.bid JOIN customeraccount c ON a.account_id = c.account_id -- WHERE a.account_type = '储蓄' ) SELECT balance AS highest_balance, bid, firstname, middleinitial, lastname FROM ranked_accounts WHERE rn = 1;
这个写法不管一个支行有多少个最高余额的账户,只会返回其中一行(如果有多个并列第一,会随机选一个,要是想都显示可以把ROW_NUMBER()换成RANK())。
为啥你原来的查询不行?
你原来的查询没加GROUP BY b.bid,而且直接拉了客户信息,数据库根本不知道怎么处理这些非聚合的客户列——同一个支行有多个客户的话,它没法确定该取哪个,要么给你报错,要么返回一堆重复的支行行,自然达不到每个bid只显示一行的要求。
内容的提问来源于stack exchange,提问作者Mia .B
相关产品推荐
相关产品推荐

