0

SQLフィドルはこちら

うまくいけば、私の目標は明確です。「開始」通貨、「終了」通貨、「購入」と「販売」の為替レート、およびレートが適用される日付を格納するテーブルがあります。

特定の締切日までのすべての通貨の最新の為替レートのリストを取得したいと思います。

つまり、次のことを意味します。

  1. 結果には、「from」と「to」の通貨の組み合わせ*ごとに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

*明確にするために:私は「from」と「to」の通貨を相互に排他的なものとして数えています。データベースに通貨ID123から通貨ID321までのレートを指定する行があり、別の行が通貨ID 321から通貨ID123までのレートを指定する場合、これらの行の両方が返されます。はい、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 に答える