![]() |
1
29
现在,将这些“准备好的”利率与交易结合起来是简单而有效的。 比如:
笔记:
|
![]() |
2
5
假设您有一个扩展的汇率表,其中包含:
我们可以讨论前两行是否应该合并的细节,但一般的想法是,找到给定日期的汇率是微不足道的。此结构与SQL“BETWEEN”运算符配合使用,该运算符包括范围的结尾。通常,范围的更好格式是“开-闭”;列出的第一个日期包括在内,第二个日期不包括在内。请注意,数据行上有一个约束条件,即(a)日期范围内的覆盖范围没有差距,(b)覆盖范围内没有重叠。强制执行这些约束并非完全微不足道(礼貌的轻描淡写——减数分裂)。
棘手的部分是动态地从给定的ExchangeRate表创建ExtendedExchangeRate表。 如果是一个选项,那么修改基本ExchangeRate表的结构以匹配ExtendedExchangeRate表将是一个好主意;当输入数据时(每月一次),而不是每次需要确定汇率时(每天多次),您就可以解决这些混乱的问题。 如何创建扩展汇率表?如果您的系统支持从日期值中加减1以获得下一天或前一天(并且有一个称为“Dual”的单行表),则
第一行:
最后一行:
中间行:
结果:
不需要的行数随着表大小的增加而急剧增加(对于N>2行,有(N-2)*(N-3)/2行不需要的行,我相信)。 ExtendedExchangeRate的结果是三个查询的(不相交)并集:
在测试DBMS(MacOS X 10.6.2上的IBM Informix Dynamic Server 11.50.FC6)上,我能够将查询转换为视图,但我必须停止对数据类型的欺骗-通过将字符串强制转换为日期:
|
![]() |
3
1
我不能测试这个,但我认为它会起作用。它使用合并和两个子查询来根据规则A或规则B选择速率。
|
![]() |
4
0
|
![]() |
5
0
根据您的方案,打破僵局的解决方案是:
您需要有正确的索引才能快速执行此查询。理想情况下,你不应该有一个
|
![]() |
6
0
没有任何一种连接方式比
这些查询确实有效(需要SQL Server 2005或更高版本)。看见 the SqlFiddle for these .
请注意,具有单个列值的交叉应用在功能上等同于
我不知道哪一个可能会表现得更好,或者哪一个会比页面上的其他答案表现得更好。如果在日期列上有一个适当的索引,它们应该会非常活跃——肯定比任何一个都好
|
![]() |
Duvan · 将逗号(,)替换为点(.)[副本] 2 年前 |
![]() |
Mateen Bagheri · 选择表的计数并选择其自身 2 年前 |
![]() |
SoT · SQL Server中求和函数的工作方式 2 年前 |
![]() |
NKAT · 将列值聚合到列表中会产生错误 2 年前 |
![]() |
deanpillow · 返回两列中有一个匹配值的记录 2 年前 |
![]() |
snowflakes74 · 在Dapper中异步查询多个结果 2 年前 |