MySQL查询咨询:获取账户最新及上一笔交易记录
获取每个账户的最新及上一笔交易记录
我来帮你搞定这个查询需求!要从单表中提取每个账户的最新交易记录,同时带上上一笔交易的数据,用窗口函数是最简洁高效的方案,下面是具体实现:
完整SQL查询语句
SELECT account_no, MAX(CASE WHEN row_num = 1 THEN date1 END) AS `latest_entry(date)`, MAX(CASE WHEN row_num = 1 THEN price END) AS `latest_price`, MAX(CASE WHEN row_num = 2 THEN date1 END) AS `previous_entry(date)`, COALESCE(MAX(CASE WHEN row_num = 2 THEN price END), 0) AS `previous_price` FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY account_no ORDER BY date1 DESC) AS row_num FROM your_table_name ) ranked_transactions GROUP BY account_no ORDER BY account_no;
语句逻辑说明
- 子查询排序:用
ROW_NUMBER()窗口函数,按account_no分组,每组内按date1降序排列,给每条记录分配序号——最新的交易是row_num=1,上一笔是row_num=2。 - 条件聚合转列:通过
CASE WHEN配合MAX()函数,把每个账户的第1条、第2条交易数据分别提取成对应的列,实现一行展示一个账户的两条交易信息。 - 处理空值:用
COALESCE()函数把没有上一笔交易的price值转为0,完全匹配你期望的输出格式。
测试结果(匹配你的示例数据)
如果用你提供的测试数据执行上述语句,会得到如下结果:
| account_no | latest_entry(date) | latest_price | previous_entry(date) | previous_price |
|---|---|---|---|---|
| 101 | 2018-04-10 | 100 | 2018-04-07 | 200 |
| 102 | 2018-04-10 | 300 | null | 0 |
注意:记得把语句中的your_table_name替换成你实际的表名哦!
内容的提问来源于stack exchange,提问作者Aries Magtibay
相关产品推荐
相关产品推荐

