У меня есть база данных Orable с таблицей, подобной следующей:
ID PROVIDER_ID FROM_CURRENCY TO_CURRENCY DATE AMOUNT ACTIVE
1 1 USD EUR 06-FEB-19 1.23 1
2 2 USD EUR 06-FEB-19 1.5 1
3 1 GBP EUR 06-FEB-19 1.23 1
4 1 CAD EUR 06-FEB-19 1.23 1
5 1 USD EUR 05-FEB-19 0.7 1
6 1 GBP EUR 05-FEB-19 0.7 1
Как вы можете видеть, мы храним обменные курсы разных поставщиков с указанием даты, и мне нужно получить идентификаторыпоследние доступные тарифы для определенных to_currency
(например, EUR) и provider_id
(например, 1) на определенную дату.Поэтому я должен получить что-то вроде следующего:
ID
1
3
4
Обратите внимание, что DATE не является уникальным, поэтому значения могут дублироваться в разных строках, и я не могу использовать его для соединения с подзапросом.Кроме того, учтите, что DATE и ID не связаны, поэтому более высокие даты не обязательно означают более высокие идентификаторы (я не могу просто использовать MAX(ID)
в предложении select для получения идентификатора целевой строки).
Iпробовал с помощью следующего запроса, но я получаю ошибку ORA-00979: not a GROUP BY expression
SELECT ID
FROM EXCHANGE_RATE
WHERE ACTIVE = 1 AND PROVIDER_ID = 1 AND TO_CURRENCY = 'EUR' AND DATE <= TO_DATE('2019-02-06', 'YYYY-MM-DD')
GROUP BY PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY
HAVING DATE = MAX(DATE)
Я также пробовал следующий запрос с той же ошибкой:
SELECT ID, MAX(DATE)
FROM EXCHANGE_RATE
WHERE ACTIVE = 1 AND PROVIDER_ID = 1 AND TO_CURRENCY = 'EUR' AND DATE <= TO_DATE('2019-02-06', 'YYYY-MM-DD')
GROUP BY PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY
Запрос, который получаетмне нужны следующие строки, но я не знаю, как получить поле идентификатора для этих строк, поскольку идентификатор не является частью предложения group by.
SELECT MAX(DATE)
FROM EXCHANGE_RATE
WHERE ACTIVE = 1 AND PROVIDER_ID = 1 AND TO_CURRENCY = 'EUR' AND DATE <= TO_DATE('2019-02-06', 'YYYY-MM-DD')
GROUP BY PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY
Любая идея о том, как можно достичьчто мне нужно?
РЕДАКТИРОВАТЬ Я думаю, что нашел решение
SELECT ID
FROM EXCHANGE_RATE E JOIN
(SELECT PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY, MAX(DATE) AS LATEST
FROM EXCHANGE_RATE
WHERE DATE <= TO_DATE('2019-02-06', 'YYYY-MM-DD')
GROUP BY PROVIDER_ID, FROM_CURRENCY, TO_CURRENCY) LATEST_EX
ON E.PROVIDER_ID = LATEST_EX.PROVIDER_ID
AND E.TO_CURRENCY = LATEST_EX.TO_CURRENCY
AND E.FROM_CURRENCY = LATEST_EX.FROM_CURRENCY
AND E.DATE = LATEST_EX.LATEST
WHERE E.ACTIVE = 1 AND E.PROVIDER_ID = 1 AND E.TO_CURRENCY = 'EUR'