【问题标题】:Calculate running product with custom expression in SQL Server 2005在 SQL Server 2005 中使用自定义表达式计算运行产品
【发布时间】:2016-05-22 21:05:16
【问题描述】:

我有两个表,第一个表 section 的架构为:

SecID  |      Date     |   SecReturn
-------|---------------|--------------
  208  |   2015-04-01  |   0.00355
  208  |   2015-04-02  |   -0.00578
  208  |   2015-04-03  |   0.00788
  208  |   2015-04-04  |   0.08662
  105  |   2015-04-01  |   0.00786

第二个表SectionDates 的架构为:

SecID |  MonthlyDate  |  DailyDate
------|---------------|-------------
208   |   2015-04-02  |  2015-04-03
105   |   2015-04-01  |  2015-04-01

我想从第二个表 SectionDates 计算日期范围(DailyDateMonthlyDate)表 SectionSecReturn 列上的运行产品。

将根据公式为每个sectionID计算跑步产品:

Date       |   SecReturn   |  SectionTotal
-----------|---------------|--------------------
2015-04-01 |  X (lets say) | (1+x)-1
2015-04-01 |  Y            | (1+x)(1+y)-1
2015-04-01 |  Z            | (1+x)(1+y)(1+z)-1

应用上述计算值后,将在 SectionTotal 列中计算日期 2015-04-01 计算值将是 (1+0.00355)-1。同样,对于日期 2015-04-02,计算值将是 (1+0.00355)(1+-0.00578)-1,对于日期 2015-04- 03 计算值将是 (1+0.00355)(1+-0.00578)(1+0.00788)-1 等等。

最终输出:

 SecID |  Date      |   SectionTotal 
-------|------------|-----------------  
  105  | 2015-04-01 |  0.00786          
  208  | 2015-04-01 |  0.00355          
  208  | 2015-04-02 |  -0.0022505       
  208  | 2015-04-03 |  0.0056117   

【问题讨论】:

  • 您好,欢迎来到 StackOverflow!您能否向我们展示您到目前为止所做的尝试?

标签: sql-server sql-server-2005


【解决方案1】:

您可以尝试以下查询:

SELECT SecID, [Date], [SecReturn], 
       ROUND((1 + SecReturn) * COALESCE(v,1) - 1, 5) AS SectionTotal   
FROM mytable AS t1
OUTER APPLY (  
    SELECT EXP(SUM(LOG(SecReturn + 1))) AS v
    FROM mytable AS t2
    WHERE t1.SecID = t2.SecID AND t1.[Date] > t2.[Date]) AS t3

OUTER APPLY,在 SQL Server 2005 AFAIK 中可用,它获取在运行乘法计算时要考虑的所有记录。

使用this post 中的乘法聚合公式,您可以获得所需的结果。

Demo here

【讨论】:

  • 它应该是 COALESCE(v,1) 并且我会考虑添加 ROUND() 来解决 EXP 函数将导致的精度损失。编辑:实际上它可以在没有外部应用的情况下以同样的方式完成 - ROUND((SELECT EXP(SUM(LOG(1+[SecReturn]))) FROM mytable WHERE [SecID] = t1.[SecID] AND [Date] <= t1.[Date]) - 1, 5)
  • 您应该注意,这对于大型表来说是 O(n²) 并且效率低下。在 SQL Server 更高版本中缺少窗口结构的情况下,有时CURSOR 可能更有效(取决于输入的大小)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-18
相关资源
最近更新 更多