MySQL查询:合并两张用户余额表获取各用户最新交易记录
解决方法:从两张表中获取每个用户的最新余额记录
嘿,我明白你的需求了——要从daily日表和consolidation历史表中,找出每个用户**最新(transactions_date最大)**的余额记录对吧?这两张表结构一致,那我们可以通过「合并数据集 + 筛选最新记录」的思路来实现,下面给你两种实用的方案:
方案一:使用窗口函数(推荐,逻辑清晰)
我们先把两张表的所有数据合并,再用窗口函数给每个用户的记录按日期降序排名,最后取排名第一的那条就是最新记录:
WITH combined_records AS ( -- 合并两张表的所有数据 SELECT user_id, transactions_date, balance FROM daily UNION ALL SELECT user_id, transactions_date, balance FROM consolidation ), ranked_records AS ( -- 按用户分组,给每条记录按日期降序排名 SELECT *, ROW_NUMBER() OVER (PARTITION BY user_id ORDER BY transactions_date DESC) AS row_rank FROM combined_records ) -- 筛选出每个用户排名第一的最新记录 SELECT user_id, transactions_date, balance FROM ranked_records WHERE row_rank = 1;
补充说明:
- 如果同一个用户在同一天有多条余额记录,
ROW_NUMBER()会随机返回其中一条;要是想保留所有同日期的记录,可以把ROW_NUMBER()换成RANK()或者DENSE_RANK()。 - 这种方法性能不错,尤其是当两张表有
user_id和transactions_date的索引时,执行效率会更高。
方案二:先找最大日期再关联
另一种思路是先找出每个用户的最大交易日期,再关联回合并后的数据集,拿到对应的余额:
WITH combined_records AS ( SELECT user_id, transactions_date, balance FROM daily UNION ALL SELECT user_id, transactions_date, balance FROM consolidation ), user_latest_dates AS ( -- 计算每个用户的最新交易日期 SELECT user_id, MAX(transactions_date) AS latest_date FROM combined_records GROUP BY user_id ) -- 关联获取最新日期对应的余额记录 SELECT cr.user_id, cr.transactions_date, cr.balance FROM combined_records cr JOIN user_latest_dates uld ON cr.user_id = uld.user_id AND cr.transactions_date = uld.latest_date;
补充说明:
- 这个方案会返回同一个用户在最新日期的所有记录(如果同一天有多条的话),适合需要保留同日期多条记录的场景。
你可以根据自己的实际需求选择其中一种方案,这两种方法都能完美覆盖从两张表中获取用户最新余额的需求~
内容的提问来源于stack exchange,提问作者R_life_R
相关产品推荐
相关产品推荐

