我有一个带有如下表的 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(例如欧元)和provider_id(例如 1)的最新可用汇率的 ID。所以我应该得到如下内容:
ID
1
3
4
请注意 DATE 不是唯一的,因此值可以在不同的行之间重复,我不能使用它来加入子查询。另外,考虑到 DATE 和 ID 不相关,因此较高的日期并不一定意味着较高的 ID(我不能只MAX(ID)在 select 子句中使用来获取目标行的 ID)。
我已尝试使用以下查询,但出现错误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
检索我需要的行的查询是以下查询,但我不知道如何获取这些行的 ID 字段,因为 ID 不是 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'