Выбор самой последней даты относительно другой таблицы - PullRequest
0 голосов
/ 05 мая 2019

Просто запутался в синтаксисе для этого ...

У меня есть две таблицы в mysql, и мне нужно извлекать записи из таблицы A при соблюдении следующих критериев: 1) Имя в таблице A соответствует имени в таблице B А ТАКЖЕ 2) Цена самого последнего дня в таблице B меньше, чем запись в таблице A

Итак ... выполнение запроса на приведенных ниже примерах таблиц принесет мне две записи:

03-17-2019    Bob   8
03-20-2019    John  10

По сути, мне нужно оценить каждую строку в Таблице A, проверить совпадающее имя в Таблице B, которое имеет самую последнюю дату относительно записи, оцениваемой в Таблице A, и затем определить, больше ли цена в Таблице A, чем цена самого последнего совпадающего имени в таблице B. После этого мне нужно вычислить разницу между ценами. Итак, в двух приведенных выше записях разница будет 2 и 4

Table A
Date       | Name | Price
03-08-2019    Bob   6
03-25-2019    Bob   2
03-17-2019    Bob   8
03-20-2019    John  10

Table B
Date      | Name  |  Price
03-16-2019    Bob   4
03-28-2019    Bob   9
03-02-2019    Bob   12
03-10-2019    John  6

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 05 мая 2019

В MySQL 8+ вы бы использовали оконные функции

select ab.*, (price - b_price)
from (select a.*, b.price as b_price,
             row_number() over (partition by a.name order by datediff(b.date, a.date) as seqnum
      from a join
           b
           on a.name = b.name and
              a.date >= b.date
     ) ab
where seqnum = 1;
1 голос
/ 05 мая 2019

Соедините дважды таблицы, один раз, чтобы получить минимальную разницу дат, а затем получить строку с минимальной разницей дат:

select a.*
from tablea a 
inner join tableb b on b.name = a.name 
inner join (
  select a.name, min(abs(datediff(b.date, a.date))) mindatediff
  from tablea a inner join tableb b
  on b.name = a.name
  group by a.name           
) g on g.name = a.name and abs(datediff(b.date, a.date)) = g.mindatediff

См. Демонстрационную версию .или:

select a.*
from tablea a inner join tableb b
on b.name = a.name
where abs(datediff(b.date, a.date)) = (
    select min(abs(datediff(x.date, y.date))) 
    from tablea x inner join tableb y
    where x.name = a.name and y.name = b.name                            
)

См. демоверсию .Результаты:

| date       | name | price |
| ---------- | ---- | ----- |
| 2019-03-17 | Bob  | 8     |
| 2019-03-20 | John | 10    |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...