希望我的目标很清楚:我有一张桌子可以存储“来自”货币,“到”货币,“买入”和“卖出”汇率,以及应该适用的汇率日期。
我想获得所有货币的最新汇率列表,直到给定的截止日期。
这意味着:
我正在使用的查询不会这样做。事实上,它目前似乎回归一切。
SELECT ce.*
FROM currency_exchange ce
LEFT JOIN currency_exchange newer
ON (
newer.currency_from = ce.currency_from
AND newer.currency_to = ce.currency_to
AND newer.exchange_date > ce.exchange_date
AND newer.exchange_date <= '2012-03-27 00:00:00'
)
WHERE newer.id IS NULL
ORDER BY ce.currency_from, ce.currency_to, ce.exchange_date DESC
*只是为了澄清:我将“从”和“到”货币视为相互排斥。如果数据库中有一行指定从货币ID 123到货币ID 321的汇率,而另一行指定从货币ID 321到货币ID 123的汇率,则应返回这两行。是的,从123到321的买入价格在逻辑上等于卖出价格从321到123,反之亦然。
答案 0 :(得分:4)
解决这个特殊问题的方法有很多种。我使用的是使用子查询,该子查询获取* currency_from,currency_to *的每个组合的当前交换日期。子查询的结果只有3列,这就是我们需要将它连接到原始表表以获取剩余列的原因,前提是它与:currency_from
,currency_to
和{匹配{1}}。
exchange_date
输出
SELECT a.*
FROM currency_exchange a
INNER JOIN
(
SELECT currency_from, currency_to, MAX(exchange_date) max_date
FROM currency_exchange
GROUP BY currency_from, currency_to
) b ON a.currency_from = b.currency_from AND
a.currency_to = b.currency_to AND
a.exchange_date = b.max_date