SQL查询需求:筛选基准货币为USD且含其他货币的账户
嘿,针对你这个筛选需求,我整理了几种实用的SQL实现方案,都是日常工作里常用的思路,你可以根据自己的表结构和需求选合适的:
方法1:使用EXISTS子查询精准匹配
这个方法直接检查每个账户是否存在非USD的货币记录,同时确保基准货币是USD,逻辑直观易懂:
SELECT DISTINCT t.account_id, t.base_currency, t.currency FROM your_table t WHERE t.base_currency = 'USD' AND EXISTS ( SELECT 1 FROM your_table t2 WHERE t2.account_id = t.account_id AND t2.currency != 'USD' );
解释:EXISTS子查询用来确认同一个账户下存在其他货币的记录,DISTINCT是为了避免重复输出同一账户的多条记录(如果一个账户有多条非USD货币的记录)。
方法2:使用GROUP BY + HAVING分组筛选
如果只需要获取符合条件的账户ID和基准货币信息,这个方法更简洁高效:
SELECT account_id, base_currency FROM your_table GROUP BY account_id, base_currency HAVING base_currency = 'USD' AND MAX(CASE WHEN currency != 'USD' THEN 1 ELSE 0 END) = 1;
或者另一种等价写法,通过统计非USD货币的种类数来判断:
SELECT account_id, base_currency FROM your_table GROUP BY account_id, base_currency HAVING base_currency = 'USD' AND COUNT(DISTINCT CASE WHEN currency != 'USD' THEN currency END) > 0;
解释:按账户和基准货币分组后,用CASE标记非USD的记录,通过MAX或COUNT判断该账户是否存在其他货币,同时锁定基准货币为USD的账户。
方法3:使用窗口函数保留全量字段
如果需要保留原表的所有列数据,窗口函数可以帮你在每条记录上标记该账户是否符合条件,再进行筛选:
WITH account_flags AS ( SELECT *, -- 统计该账户持有的货币种类总数 COUNT(DISTINCT currency) OVER (PARTITION BY account_id) AS total_currency_types, -- 标记该账户是否持有非USD货币 MAX(CASE WHEN currency != 'USD' THEN 1 ELSE 0 END) OVER (PARTITION BY account_id) AS has_other_currency FROM your_table ) SELECT * FROM account_flags WHERE base_currency = 'USD' AND has_other_currency = 1;
解释:先通过窗口函数给每个账户打上标记,再筛选出基准货币为USD且持有其他货币的记录,这样可以完整保留原表的所有字段信息。
内容的提问来源于stack exchange,提问作者Christopher Lewis
相关产品推荐
相关产品推荐

