查找未找到日期完全匹配的最新行

Fra*_*Ong 4 sql-server t-sql

我正在尝试编写一个查询,尝试提取汇率的值,其中:

  • 查询日期=兑换日期;和
  • 查询币种=指定币种

如果它不包含像 2015 年 9 月 5 日那样的匹配值,它应该从包含值的最后一个日期中提取值。在这种情况下,该值应取自 4-Sep-2015:

 Create Table ExchRate
 (  Exch_ID int,
    Currency varchar(3),
    Exch_value numeric(14,7),
    Exch_date datetime)

Insert INTO ExchRate 
Values (1, 'SGD', 1.4173000, '2015-09-04 00:00:00'),
       (2, 'SGD', 1.4240000, '2015-09-07 00:00:00'),
       (3, 'SGD', 1.4291500, '2015-09-08 00:00:00'),
       (4, 'EUR', 0.8984700, '2015-09-04 00:00:00'),
       (5, 'EUR', 0.8955700, '2015-09-07 00:00:00'),
       (6, 'EUR', 0.8957000, '2015-09-08 00:00:00')
Run Code Online (Sandbox Code Playgroud)

结果应该是:

Currency   Exch_Date   Exch_Value
SGD        2015-09-05  1.4173000
Run Code Online (Sandbox Code Playgroud)

其次,如果我从另一个表加入以计算美元的总成本怎么办?我应该使用什么样的 SQL 语句?在这个SQLFiddle 示例中,它应该为每个具有不同 PO 日期的 PO 提供汇率值。

Geo*_*son 7

下面的查询怎么样?如果存在,此查询将在查询日期进行交换。如果不是,它将查找查询日期之前的最近兑换日期并使用该日期的汇率。

DECLARE @Query_currency VARCHAR(3) = 'SGD',
        @Query_date DATETIME = '2015-09-05 00:00:00'
SELECT TOP(1) Currency, Exch_date AS Observed_exch_date,
    @Query_date AS Exch_date, Exch_value
FROM ExchRate
-- Find the exchange rate on the query date for this currency
-- If there isn't one, find the most recent exchange rate
WHERE Currency = @Query_currency
    AND Exch_date <= @Query_date
ORDER BY Observed_exch_date DESC
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

批量查询汇率

如果您需要一次查找多行的汇率,您可以使用CROSS APPLY查找每行的最新汇率。如果您确保有(Currency, Exch_date)包含该Exch_value列的适当索引,则查找每一行的汇率将执行一次查找,无需额外排序。您可以在此SQL Fiddle 中看到完整的演示。

SELECT p.PO_Num, p.PO_Cur, p.PO_Date, e.Exch_date, e.Exch_value
FROM PO p
CROSS APPLY (
    -- For each PO, seek to the current or most recent exchange rate
    SELECT TOP 1 ex.Exch_date, ex.Exch_value
    FROM ExchRate ex
    WHERE ex.Currency = p.PO_Cur
      AND ex.Exch_date <= p.PO_Date
    ORDER BY ex.Exch_date DESC
) e
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明

  • 很高兴听到这奏效。共享我们可以自己运行的小提琴和/或脚本对于让我们更好地帮助您非常有用,所以感谢您这样做!我已经将 SQL 小提琴和关于批量查找汇率的讨论合并到我的答案中。如果您觉得问题已得到完整回答,您可以[接受答案](http://stackoverflow.com/help/someone-answers)。 (6认同)