【问题标题】:Getting values corresponding to start date and end date获取与开始日期和结束日期对应的值
【发布时间】:2017-06-11 09:58:18
【问题描述】:

我有以下表格的表格

Name    Currency    Rate    Effective date
Institution 1   USD 0.25    Sunday, June 05, 2016
Institution 1   CAD 0.35    Monday, December 05, 2016
Institution 1   USD 0.5 Monday, April 03, 2017
Institution 2   USD 0.25    Sunday, August 07, 2016
Institution 2   USD 0.28    Sunday, January 15, 2017
Institution 2   CAD 0.35    Saturday, April 20, 2013
Institution 2   CAD 0.25    Monday, March 06, 2017

我需要在 SQL Server 中为每个机构和货币分组查询,获取开始日期和结束日期之间生效日期的汇率。如果声明的开始日期和结束日期之间没有生效日期,则查找低于开始日期的最后一个生效日期并获得相应的费率,例如如果开始日期是 2017 年 1 月 1 日,结束日期是 2017 年 3 月 31 日,那么对于机构 1,美元汇率将为 0.25,加元汇率将为 0.35。同样,开始日期为 2017 年 4 月 1 日,结束日期为 2017 年 5 月 31 日,美元汇率为 0.5,加元汇率为 0.35。

任何帮助将不胜感激!

【问题讨论】:

  • 您当前的查询是什么样的?
  • 在以后的注释中,您至少应该尝试查询并将其包含在问题中。另外请了解如何正确显示固定宽度的数据(您可以使用工具栏),对于示例数据中的日期,请不要使用日期和月份名称。
  • 我会确保在问题中包含我的查询。也不包括示例数据的日期和月份名称。但我不确定工具栏。下次会努力做得更好。

标签: sql-server


【解决方案1】:

如果我理解正确,您可以查询如下:

Select * from (
     Select Name,   Currency,   Rate,   [Effective date],
        RowN = Row_Number() over (Partition by [Name], [Currency] Order by [Effective Date] desc)
     from yourTable 
     where [Effective Date] between @startDate and @EndDate ) a
    where a.RowN = 1

其他方面

 Select top (1) with ties 
     Name,  Currency,   Rate,   [Effective date]
     from yourTable
     Where [Effective Date] between @startDate and @EndDate
     Order by Row_Number() over (Partition by [Name], [Currency] Order by [Effective Date] desc)

两者的工作逻辑相同。

但这不包括您的要求“如果声明的开始日期和结束日期之间没有生效日期,则查找最后一个生效日期低于开始日期”,因为我不清楚。你能展示更多的样本吗..

【讨论】:

  • 其中一个例子可能是,如果开始日期是 2017 年 4 月 10 日,结束日期是 2017 年 5 月 31 日,那么对于机构 1,加元汇率应该是 0.35,因为两者之间没有有效日期开始日期和结束日期 此外,对于美元汇率,它将查看生效日期,因为 2017 年 4 月 3 日是 2016 年 6 月 5 日之后,它应该采用对应于 4 月 3 日的 0.5 汇率,而不是 0.25 汇率
【解决方案2】:

使用 ROW_NUMBER() 和 OVER() 是确定“最近”或“最新”行的有效方法。在 OVER 子句中,ORDER BY ... DESC 用于定位“最新”信息。

在这个问题中,需要在日期范围内有点误导,因为只需要生效日期在该范围的结束日期之前,因此:小于结束日期 em> 涵盖了所有想要的结果,如下所示。

样本数据:

CREATE TABLE Table1
    ([Name] varchar(12), [Currency] varchar(3), [Rate] decimal(12,2), [EffectiveDate] datetime)
;

INSERT INTO Table1
    ([Name], [Currency], [Rate], [EffectiveDate])
VALUES
    ('Institution1', 'USD', 0.25, '2016-06-05 00:00:00'),
    ('Institution1', 'CAD', 0.35, '2016-12-05 00:00:00'),
    ('Institution1', 'USD', 0.5, '2017-04-03 00:00:00'),
    ('Institution2', 'USD', 0.25, '2016-08-07 00:00:00'),
    ('Institution2', 'USD', 0.28, '2017-01-15 00:00:00'),
    ('Institution2', 'CAD', 0.35, '2013-04-20 00:00:00'),
    ('Institution2', 'CAD', 0.25, '2017-03-06 00:00:00')
;

查询 1

declare @EndDate as datetime 
set @EndDate = '20170331'

SELECT
      *
FROM (
      SELECT
            Name
          , Currency
          , Rate
          , EffectiveDate
          , ROW_NUMBER() OVER (PARTITION BY Name, Currency ORDER BY EffectiveDate DESC) AS rn
          , @EndDate EndDate
      FROM Table1
      WHERE EffectiveDate < @EndDate
      ) AS d
WHERE d.rn = 1
;

结果 1

/*
If start date is Jan 1, 2017 and end date is Mar 31, 2017 
then for Institution 1, USD Rate will be 0.25 and CAD Rate will 0.35.
*/
+----+--------------+----------+------+---------------+----+------------+
|    |     Name     | Currency | Rate | EffectiveDate | rn |  EndDate   |
+----+--------------+----------+------+---------------+----+------------+
|  1 | Institution1 | CAD      | 0.35 | 05/12/2016    |  1 | 31/03/2017 |
|  2 | Institution1 | USD      | 0.25 | 05/06/2016    |  1 | 31/03/2017 |
|  3 | Institution2 | CAD      | 0.25 | 06/03/2017    |  1 | 31/03/2017 |
|  4 | Institution2 | USD      | 0.28 | 15/01/2017    |  1 | 31/03/2017 |
+----+--------------+----------+------+---------------+----+------------+

查询 2

set @EndDate = '20170531'

SELECT
      *
FROM (
      SELECT
            Name
          , Currency
          , Rate
          , EffectiveDate
          , ROW_NUMBER() OVER (PARTITION BY Name, Currency ORDER BY EffectiveDate DESC) AS rn
          , @EndDate EndDate
      FROM Table1
      WHERE EffectiveDate < @EndDate
      ) AS d
WHERE d.rn = 1
;

结果 2

/*
Similarly for start date Apr 1, 2017 and end date May 31, 2017 
USD Rate will be 0.5 and CAD Rate will be 0.35.
*/
+----+--------------+----------+------+---------------+----+------------+
|    |     Name     | Currency | Rate | EffectiveDate | rn |  EndDate   |
+----+--------------+----------+------+---------------+----+------------+
|  1 | Institution1 | CAD      | 0.35 | 05/12/2016    |  1 | 31/05/2017 |
|  2 | Institution1 | USD      | 0.50 | 03/04/2017    |  1 | 31/05/2017 |
|  3 | Institution2 | CAD      | 0.25 | 06/03/2017    |  1 | 31/05/2017 |
|  4 | Institution2 | USD      | 0.28 | 15/01/2017    |  1 | 31/05/2017 |
+----+--------------+----------+------+---------------+----+------------+

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-12
    • 2012-08-19
    相关资源
    最近更新 更多