1

我有一个带有如下表的 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'
4

3 回答 3

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
于 2019-02-07T16:10:12.693 回答
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

于 2019-02-07T16:08:30.200 回答
0

编写存储过程以保存最终查询返回的数据行并通过获取表中的指针来获取 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 中使用它,但我认为这不会解决目的,子查询不会像你提到的那样工作。

希望这可以帮助 :)

于 2019-02-07T15:49:36.087 回答