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

时间:2019-02-07 15:38:17

标签: 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             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

3 个答案:

答案 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' 

Demo