选择sql组中的最后一组记录

选择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

我有一个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
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