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
我之前通过抓住最佳结果在其他数据库上执行此操作,但这里缺少架构使得任务对我来说变得更加困难。
答案 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;
还有其他方法,但这看起来就像您尝试使用第一个查询一样。但是,您似乎对查询中的货币对的角色和日期感到困惑。