选择sql组中的最后一组记录
我有一个Orable数据库,其表如下:选择sql组中的最后一组记录,sql,oracle,Sql,Oracle,我有一个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
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
ID
1
3
4
如您所见,我们存储不同提供商的汇率及其日期,我需要的是获取特定日期的特定至(如欧元)和提供商id
(如1)的最新可用汇率id。所以我应该得到如下结果:
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
ID
1
3
4
请注意,日期不是唯一的,因此可以在不同的行之间复制值,并且我不能使用它来连接子查询。同样,考虑日期和ID不相关,所以较高的日期并不一定意味着更高的ID(我不能只在select子句中使用<代码> max(id)< /c>以获取目标行的ID)。
我尝试了以下查询,但得到一个错误ORA-00979:不是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
从汇率
其中ACTIVE=1,PROVIDER_ID=1,TO_CURRENCY='EUR'和DATE是编写存储过程的最简单方法,用于保存最终查询返回的数据行,并通过获取表中该行的指针来获取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
选择最大值(日期)
从汇率
当ACTIVE=1,PROVIDER_ID=1,TO_CURRENCY='EUR'和DATE时,您可以使用子查询
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'
用户行数()
函数,用于按降序排列每种货币的日期
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
我认为您遗漏了一点,我需要的是获取(provider\u id,from\u currency,to\u currency)的每个最新组合,但是您的答案中的子查询将只返回一个结果,其中包含与where子句匹配的所有行之间的最大值。@beni0888子查询已经满足所有必需的条件。我添加了演示。它之所以有效,是因为数据集中有一个巧合。尝试将第四行的日期(CAD,EUR)更改为2019-02-05
之前的一天,您会发现结果中没有包含该日期,这是可能的。但无论如何,还是要感谢您通过一个例子提出了解决方案:)@beni0888 welcome。在这种情况下,ID 1和3返回,好的,但是您不需要1,1的最后日期吗?不考虑日期已经1,3,4,5,6将返回。Barbaros,我不是说你不应该考虑日期,只是指出,你提出的解决方案并没有实现我所寻求的。我需要检索每个(提供者\u id,从\u货币到\u货币)的最新行,而不管它们之间的日期差异。感谢您的编辑,,,在第\u行编号后匆忙写入忘记()#
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