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

У меня есть две таблицы:

INFO таблица

ID        LockDate            Investor 
157       10/15/2018          TEST1
VF1       09/02/2018          TEST2
LO2       05/01/2018          TEST3
09K       03/03/2012          TEST4
098       05/01/2012          TEST5
099       09/09/2012          TEST6
2YT       08/25/2012          TEST7

NUMBERS таблица

Dates              Amount
10/10/2018         25.10
08/31/2018         200.15
05/10/2018         15.251
03/03/2012         10.10
05/10/2012         15.251
08/31/2012         548.0          

Я хочу, чтобы запрос выбрал все значения в таблице INFO, нашел ближайшую или равную дату в таблице Numbers и дал мне сумму.Таким образом, мои результаты будут:

ID        LockDate            Investor         Amount
157       10/15/2018          TEST1            25.10
VF1       09/02/2018          TEST2            200.15
LO2       05/01/2018          TEST3            15.251
09K       03/03/2012          TEST4            10.10
098       05/01/2012          TEST5            15.251
099       09/09/2012          TEST6            548.0
2YT       08/25/2012          TEST7            548.0

Под ближайшим я имею в виду равный или ближайший, независимо от того, является ли он меньше или больше , чем дата блокировки.

Это запрос, который я использую, но он просто извлекает больший или равный запрос, который не работает для меня, так как я должен делать это динамически ...

SELECT I.* ,
       N.Amount  FROM 
(
SELECT  A.*, MIN(NUM.Dates) AS XDATE
FROM INFO A
INNER JOIN NUMBERS AS NUM
ON NUM.Dates >= A.LockDate
GROUP BY A.ID
)AS RES
INNER JOIN NUMBERS AS N
ON N.Dates = I.XDATE  

Я буду признателенлюбая помощь.

Ответы [ 2 ]

0 голосов
/ 13 сентября 2018

Вам просто нужно найти абсолютное минимальное значение для LockDate минус Dates. Это даст вам самую близкую дату; меньше или больше. Отдыхать просто.

SELECT info.*, numbers.*
FROM info
INNER JOIN (
    SELECT ID, MIN(DATEDIFF(GREATEST(LockDate, Dates), LEAST(LockDate, Dates))) Delta
    FROM info
    CROSS JOIN numbers
    GROUP BY ID
) g ON info.ID = g.ID
INNER JOIN numbers ON DATEDIFF(GREATEST(LockDate, Dates), LEAST(LockDate, Dates)) = g.Delta

SQL Fiddle

0 голосов
/ 13 сентября 2018

Не уверен, каково ваше определение "ближайший".

Вот мой подход к получению dates<=LockDate

http://sqlfiddle.com/#!9/8eea46/8

SELECT i.*, n.amount 
FROM info i
LEFT JOIN numbers n
ON i.LockDate >= n.dates
LEFT JOIN numbers n_all
ON i.LockDate >= n_all.dates
   AND n_all.dates > n.dates
WHERE n_all.dates IS NULL

Примечание: ожидаемый результат отличается, так как определение «ближайшего» вида изменилось.

PS

В: Почему я считаю, что это хороший подход?

A: Поскольку всякий раз, когда мы имеем дело с данными, относящимися к временной шкале, обычно мы ожидаем, что данные будут знать, что (состояние, события, результаты) было до того момента, когда мы имеем на временной шкале, но не то, что произойдет в будущем. Это означает, что строка / запись 31.12.2017 г. может иметь / собирать данные из любой таблицы / записей до 31.12.2017 г., но не из 2018. Эта стратегия помогает поддерживать согласованность отчетов. Они меньше зависят от даты, когда мы генерируем отчет. если мы создадим отчет о декабре 2017 года на 1 января 2018 года, он выдаст тот же результат, как если бы мы сгенерировали тот же отчет за тот же период декабря 2017 года, но неделю или месяц спустя 10 января 2018 года или 1 февраля.

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