我有一个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)和{{1 }}(例如1)在某个日期。所以我应该得到如下信息:
provider_id
请注意,DATE不是唯一的,因此值可以在不同的行之间重复,并且我不能将其用于子查询。另外,请考虑DATE和ID不相关,因此较高的日期不一定意味着较高的ID(我不能仅在select子句中使用ID
1
3
4
来获取目标行的ID)。
我尝试使用以下查询,但收到错误MAX(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)
检索我需要的行的查询是以下查询,但由于ID并非group by子句的一部分,因此我不知道如何获取这些行的ID字段。
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
关于如何实现我所需要的任何想法?
编辑 我想我已经找到了解决方法
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
答案 0 :(得分:2)
用户row_number()
函数可按每种货币的降序对日期进行排序
SELECT id
FROM
(SELECT id, provider_id, from_Currency,
row_number() over
( partition by from_Currency order by "DATE" desc ) as rn
FROM EXCHANGE_RATE
)
WHERE rn=1
答案 1 :(得分:0)
最简单的方法是编写存储的proc,以保存最终查询返回的数据行,并通过获取表中的指针来获取ID。
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
除此之外,从单个查询中获取ID返回的唯一方法是在group by中使用该查询,但我看不出能解决此目的,子查询不能像您提到的那样工作。
希望这会有所帮助:)
答案 2 :(得分:0)
您可以使用子查询
SELECT ID
FROM EXCHANGE_RATE
WHERE ("DATE") IN
(
SELECT MAX("DATE")
FROM EXCHANGE_RATE
WHERE ACTIVE = 1
AND PROVIDER_ID = 1
AND TO_CURRENCY = 'EUR'
)
AND ACTIVE = 1
AND PROVIDER_ID = 1
AND TO_CURRENCY = 'EUR'