Обложка канала

Oracle Developer👨🏻‍💻

Все о разработке в СУБД "Oracle" SQL, PL/SQL, оптимизация, архитектура, сертификации и многое другое.

Oracle Developer👨🏻‍💻

4 года назад
Открыть в
Задача с курсами валют Постановку задачи смотрите в посте вторника. Довольно баянная задача. Периодически встречается на собесах. 1. Для решения используем конструкцию keep dense rank в режиме группировки по name (group by name). 2. Сортировка внутри групп по колонке date по убыванию (desc). Если есть null-значения в колонке date, то они уйдут в самый верх отсортированных значений (nulls last). 3. first - берем первый результат ранжирования внутри группы ибо desc-сортировка. 4. Для каждого требуемого столбца результата выбираем соответствующие столбцы - date/rate. min - получает минимальное значение из первого результата. В данном случае, без разницы min/max. Итого: select t.name ,min(ddate) keep(dense_rank first order by ddate desc nulls last) ddate ,min(rate) keep(dense_rank first order by ddate desc nulls last) rate from FxRates t group by t.name; Запрос можно переписать на такой: select t.name ,min(ddate) keep(dense_rank last order by ddate asc nulls first) ddate ,min(rate) keep(dense_rank last order by ddate asc nulls first) rate from FxRates t group by t.name; Объяснения может не хватить, особенно, если вы никогда не сталкивались с этим. Рекомендую воссоздать тестовый пример и поиграться с конструкцией keep dense_rank first/last. У меня в загашнике есть еще одна очень интересная задачка на эту тему 😉 #решениезадачи #яндекс