Как выбрать предыдущее ближайшее значение в sql - PullRequest
0 голосов
/ 02 мая 2018

Сейчас у меня есть 2 таблицы:

* Таблица1 - * Дата обменного курса 00/00/0000 0,6 01.04.2008 0,81 4/2/2018 0,82 01.05.2008 0.83 2/2/2018 0,81 03.05.2008 0.82

* Таблица2 - *

Дата USD 02.02.2008 50 05.03.08 60 01.04.2008 50 03.04.2008 100 15.04.2008 200 01.05.2008 60 02.05.2008 80 03.05.2008 90

Я хочу иметь таблицу 3, которая отражает конвертированную сумму * Таблица3 - *

Дата USD Конвертированная сумма 02.02.2008 50 50 * 0,6 = 30 3/5/2018 60 60 * 0,6 = 36 01.04.2008 50 50 * 0,81 = 40,5 03.04.2008 100 100 * 0,82 = 82 15.04.2008 200 200 * 0,82 = 164 01.05.2008 60 60 * 0,83 = 49,8 02.05.2008 80 80 * 0,81 = 64,8 03.05.2008 90 90 * 0,82 = 73,8

Как бы я сделал это в SQL? Исходные данные очень большие.

Дело в том, что я бы хотел, чтобы таблицы Table_'s 15/4/2018 и 3/4/2018 convert_amount следовали за обменным курсом 4/2/2018, поскольку обмены 15/04/2018 или 03.04.2017 отсутствуют ставка в табл. По сути, я хотел бы, чтобы отсутствующий обменный курс следовал за курсом ближайшей предыдущей даты.

Кроме того, для всех дат, предшествующих 01.04.2017, обменный курс должен соответствовать обменному курсу 00/00/0000 Таблицы.

Очень ценю вашу помощь! Большое вам спасибо!

1 Ответ

0 голосов
/ 02 мая 2018

Вы можете использовать коррелированный подзапрос, который находит ближайшую дату в таблице 1 для каждой даты в таблице 2:

SELECT
    t2.Date,
    t2.USD,
    t2.USD * (SELECT t1.ExchangeRate FROM Table1 t1
              WHERE t1.Date <= t2.Date
              ORDER BY DATEDIFF(t2.Date, t1.Date) LIMIT 1) AS ConvertedAmount
FROM Table2 t2;

enter image description here

Демо

Обратите внимание, что это неконтролируемый подход, поскольку в таблице 1 могут быть две ближайшие даты по обе стороны от даты в таблице 2, и одна может быть выбрана произвольно. Действительно, лучшим долгосрочным подходом здесь было бы использование календарной таблицы, в которой просто указаны курсы валют на каждый день.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...