抓住最新的外汇汇率

时间:2016-09-07 09:34:40

标签: sql sql-server tsql

MS-SQL2012在这里。我的任务是从数据库中获取最新的汇率。我知道有多种方法可以执行此操作,例如执行连接或使用窗口函数,但我似乎有一个问题,即两者都能正常运行。

原始任务如下所示。

编写SQL过程,在给定以下强制参数的情况下返回最新的可用汇率:

  • 来源货币[SRCCURRENCY]

  • 目的地货币[CURRENCY1]

  • 日期[REFERENCEDATE]

  • 评分[RATE1]

来自DCURRENCY数据库。

您的程序不应包括已从系统中删除的任何费率,如果在传递到程序参数的日期不存在费率,则应返回该日期之前的最新可用费率。

我尝试编写了一个连接和Windows程序,最后发现了一个捏造的错误。以下显示如下。

根据我的理解,如果有人能告诉我他们将采用哪种方式,以及为什么会这样做,那将会很棒。

SELECT 
   CURRENCY1
   ,SRCCURRENCY
  ,REFERENCEDATE
 , RATE1

SELECT RANK()
 OVER (PARTITION BY SRCCURRENCY ORDER BY CURRENCY1 DESC) AS N

 FROM [DCURRENCY]

并通过加入;

SELECT  [CURRENCY1]
  ,[SRCCURRENCY]
  ,[REFERENCEDATE]
  ,[RATE1]
  FROM [DCURRENCY]
  INNER JOIN (SELECT [CURRENCY1], MAX(REFERENCEDATE) AS [REFERENCEDATE]
  FROM SRCCURRENCY
  ORDER BY REFERENCEDATE DESC

我之前通过抓住最佳结果在其他数据库上执行此操作,但这里缺少架构使得任务对我来说变得更加困难。

1 个答案:

答案 0 :(得分:0)

您的查询在语法上不正确。但是,正常的思考方式是:您正在寻找具有最新日期的货币对。

解决此问题的典型方法是使用row_number(),如下所示:

select d.*
from (select d.*,
             row_number() over (partition by srccurrency, destcurrency order by referencedate desc) as seqnum
      from dcurrency d
     ) d
where seqnum = 1;

还有其他方法,但这看起来就像您尝试使用第一个查询一样。但是,您似乎对查询中的货币对的角色和日期感到困惑。