Найдите строку с сегодняшней действительной ценой в зависимости от даты validFrom в mySQL

Вот и все. У меня есть следующие данные:

type, validfrom, price
1, 2018-01-15, 10 
1, 2018-01-20, 20 
1, 2018-01-25, 30 
2, 2018-01-01, 12 
3, 2018-01-01, 18

Сегодня 2018-01-21, мне нужен запрос, который дает следующий результат:

1, 2018-01-20, 20
2, 2018-01-01, 12
3, 2018-01-01, 18

Я пробовал разные комбинации с использованием подвыборов и групп, но мне не удалось найти хороший, короткий запрос, решающий эту проблему (и это тоже работает).

Есть идеи?

2 ответа

Решение

В MySQL вы можете сделать:

select t.*
from t
where t.validfrom = (select max(t2.validfrom)
                     from t t2
                     where t2.type = t.type and
                           t2.validfrom < now()
                    );

С индексом на t(type, validfrom)это должно иметь очень хорошую производительность.

http://sqlfiddle.com/

SELECT p.*
FROM prices p
LEFT JOIN prices p_
ON p.type = p_.type
   AND p.validfrom < p_.validfrom
   AND p_.validfrom< NOW()
WHERE p_.type IS NULL
    AND p.validfrom<=NOW()
Другие вопросы по тегам