0

SQL 小提琴在这里

希望我的目标很明确:我有一个表格,其中存储“起始”货币、“到”货币、“买入”和“卖出”汇率,以及该汇率应适用的日期。

我想获取所有货币的最新汇率列表,直到给定的截止日期。

这意味着:

  1. 结果应包括“从”和“到”货币的每个组合*的一行,以及
  2. 如果表中有不止一行具有“从”和“到”货币的特定组合,则提取的行应该是最近日期的行。

我正在使用的查询不这样做。事实上,它目前似乎返回了一切。

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 的卖出价,反之亦然。

4

1 回答 1

4

如何解决这个特定问题有很多方法。我使用的方法是使用子查询获取*currency_from、currency_to* 的每个组合的当前交换日期。子查询的结果只有 3 列,这就是为什么我们需要在原始表中加入它以获取剩余的列,前提是它与:currency_from、、currency_toexchange_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

输出

╔════╦═══════════════╦═════════════╦═════════╦══════════╦═════════════════════╗
║ ID ║ CURRENCY_FROM ║ CURRENCY_TO ║ RATE_IN ║ RATE_OUT ║    EXCHANGE_DATE    ║
╠════╬═══════════════╬═════════════╬═════════╬══════════╬═════════════════════╣
║ 20 ║             1 ║           2 ║ 1.43    ║ 1.65     ║ 2013-03-05 15:55:29 ║
║ 19 ║             1 ║           3 ║ 1.1     ║ 1.26     ║ 2013-03-05 15:49:45 ║
║ 16 ║             2 ║           3 ║ 2       ║ 3        ║ 2012-11-16 15:44:33 ║
╚════╩═══════════════╩═════════════╩═════════╩══════════╩═════════════════════╝
于 2013-03-27T09:04:08.353 回答