如何在SQL中查询指定日期前各货币对的最新汇率记录
问题描述
数据表结构与数据
有一张汇率表(假设表名为exchange_rates),字段包含:
id: 记录IDbaseCur: 基准货币curr: 目标货币rate: 汇率date: 汇率日期
表内具体数据如下:
| id | baseCur | curr | rate | date |
|---|---|---|---|---|
| 1 | INR | USD | 81 | 2022-11-09 |
| 2 | INR | USD | 82 | 2022-11-08 |
| 3 | INR | USD | 80 | 2022-11-06 |
| 4 | INR | CAD | 56 | 2022-11-05 |
| 5 | INR | RUB | 0.74 | 2022-11-04 |
| 6 | INR | CAD | 57 | 2022-11-12 |
查询需求
查询所有日期小于2022-11-09的各货币对(baseCur+curr组合)最新汇率记录,且每个货币对仅保留一条最新日期的记录。
预期输出
| id | baseCur | curr | rate | date |
|---|---|---|---|---|
| 2 | INR | USD | 82 | 2022-11-08 |
| 4 | INR | CAD | 56 | 2022-11-05 |
| 5 | INR | RUB | 0.74 | 2022-11-04 |
输出说明
- ID为1、6的记录被排除:因其日期大于等于
2022-11-09,不符合日期筛选条件; - ID为3的记录被排除:同货币对(INR→USD)存在ID为2的记录,日期更新(
2022-11-08晚于2022-11-06),因此仅保留最新的那条记录。
解决方案
可以通过窗口函数ROW_NUMBER()实现需求,SQL语句如下:
SELECT id, baseCur, curr, rate, date FROM ( SELECT *, ROW_NUMBER() OVER ( PARTITION BY baseCur, curr ORDER BY date DESC ) AS rn FROM exchange_rates WHERE date < '2022-11-09' ) t WHERE rn = 1 ORDER BY id;
语句逻辑解释
- 内层子查询:先筛选出所有日期小于
2022-11-09的记录,再用ROW_NUMBER()按baseCur和curr分组(即每个货币对为一组),每组内按date降序排序,给每条记录标记序号rn,组内最新的记录序号为1。 - 外层查询:只取每组中序号
rn=1的记录,也就是每个货币对的最新汇率记录。
内容的提问来源于stack exchange,提问作者nil96
相关产品推荐
相关产品推荐

