这种自我左联接返回的记录比我预期的要多

时间:2013-03-27 09:00:14

标签: mysql sql select greatest-n-per-group

SQL fiddle is here

希望我的目标很清楚:我有一张桌子可以存储“来自”货币,“到”货币,“买入”和“卖出”汇率,以及应该适用的汇率日期。

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

这意味着:

  1. 结果应包括“from”的每个组合*的一行 和“到”货币,和
  2. 如果表格中有多行 用“from”和“to”货币表示该行的特定组合 fetched应​​该是最近日期的那个。
  3. 我正在使用的查询不会这样做。事实上,它目前似乎回归一切。

    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,反之亦然。

1 个答案:

答案 0 :(得分:4)

解决这个特殊问题的方法有很多种。我使用的是使用子查询,该子查询获取* currency_from,currency_to *的每个组合的当前交换日期。子查询的结果只有3列,这就是我们需要将它连接到原始表表以获取剩余列的原因,前提是它与:currency_fromcurrency_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