MySQL实现同表同时间下非USD汇率与USD汇率的除法运算
解决方案:计算指定货币与同期USD汇率的比值
要实现同一temptime下指定货币汇率和USD汇率的商,有两种常用的SQL写法,适配不同版本的MySQL环境:
方法1:自连接(兼容所有MySQL版本)
通过将表与自身按temptime关联,匹配出每个时间点的USD汇率,再计算比值:
SELECT cr.currency, cr.rate, cr.temptime, cr.rate / usd.rate AS usd_relative_rate FROM currency_rates cr JOIN currency_rates usd ON cr.temptime = usd.temptime AND usd.currency = 'USD' -- 可选:筛选特定货币,比如只看AUD和CAD -- WHERE cr.currency IN ('AUD', 'CAD') ORDER BY cr.temptime, cr.currency;
说明:
- 主表
cr取出所有货币的汇率记录,通过temptime关联到子表usd中同一时间的USD汇率 - 直接用
cr.rate / usd.rate得到相对USD的比值 - 如果只需要计算特定货币,加上
WHERE条件即可
方法2:窗口函数(MySQL 8.0+ 推荐)
利用窗口函数在同一行中直接获取当前temptime对应的USD汇率,写法更简洁高效:
SELECT currency, rate, temptime, rate / MAX(CASE WHEN currency = 'USD' THEN rate END) OVER (PARTITION BY temptime) AS usd_relative_rate FROM currency_rates -- 可选:筛选特定货币 -- WHERE currency IN ('AUD', 'EUR', 'CAD') ORDER BY temptime, currency;
说明:
MAX(CASE WHEN currency = 'USD' THEN rate END) OVER (PARTITION BY temptime)会为每个temptime分组提取出USD的汇率(每组仅一条USD记录,MAX不影响结果)- 直接用当前货币的rate除以这个值,得到相对比值
- 窗口函数无需额外表连接,查询逻辑更直观,性能更优
测试示例(基于你提供的样本数据)
对于2018-03-16的记录:
- USD汇率:1.232
- AUD相对比值:133.82 / 1.232 ≈ 108.62
- CAD相对比值:1.99 / 1.232 ≈ 1.615
执行上述SQL后会直接输出这些计算结果。
内容的提问来源于stack exchange,提问作者Julius Barra
相关产品推荐
相关产品推荐

