【问题标题】:How do add running quarterly and yearly average columns to an existing table on SQL Server如何将运行的季度和年度平均列添加到 SQL Server 上的现有表
【发布时间】:2018-08-15 18:36:19
【问题描述】:

我有一个看起来像这样的表(例如):

+------------+----------+---------+---------+------+
|    Date    |   NAV    |  YrMn   |  YrQt   |  Yr  |
+------------+----------+---------+---------+------+
| 2/2/2015   | 20201975 | 2015-02 | 2015-Q1 | 2015 |
| 2/5/2015   | 20238246 | 2015-02 | 2015-Q1 | 2015 |
| 2/6/2015   | 20220397 | 2015-02 | 2015-Q1 | 2015 |
| 3/2/2015   | 25597902 | 2015-03 | 2015-Q1 | 2015 |
| 3/3/2015   | 25218728 | 2015-03 | 2015-Q1 | 2015 |
| 3/5/2015   | 25332618 | 2015-03 | 2015-Q1 | 2015 |
| 4/7/2015   | 25418590 | 2015-04 | 2015-Q2 | 2015 |
| 4/8/2015   | 25641822 | 2015-04 | 2015-Q2 | 2015 |
| 4/9/2015   | 25554811 | 2015-04 | 2015-Q2 | 2015 |
| 5/7/2015   | 30366075 | 2015-05 | 2015-Q2 | 2015 |
| 5/11/2015  | 30682382 | 2015-05 | 2015-Q2 | 2015 |
| 5/12/2015  | 30302426 | 2015-05 | 2015-Q2 | 2015 |
| 8/23/2016  | 33089750 | 2016-08 | 2016-Q3 | 2016 |
| 8/24/2016  | 32927879 | 2016-08 | 2016-Q3 | 2016 |
| 8/29/2016  | 32788338 | 2016-08 | 2016-Q3 | 2016 |
| 9/23/2016  | 32027027 | 2016-09 | 2016-Q3 | 2016 |
| 9/26/2016  | 31610061 | 2016-09 | 2016-Q3 | 2016 |
| 9/27/2016  | 31730128 | 2016-09 | 2016-Q3 | 2016 |
| 10/26/2016 | 31585115 | 2016-10 | 2016-Q4 | 2016 |
| 10/27/2016 | 31222400 | 2016-10 | 2016-Q4 | 2016 |
| 10/28/2016 | 31148585 | 2016-10 | 2016-Q4 | 2016 |
| 11/1/2016  | 31216799 | 2016-11 | 2016-Q4 | 2016 |
| 11/2/2016  | 31112343 | 2016-11 | 2016-Q4 | 2016 |
| 11/3/2016  | 30572465 | 2016-11 | 2016-Q4 | 2016 |
+------------+----------+---------+---------+------+

为简单起见,我取出了很多数据,但每个工作日都会为当天的数据添加一行。我想在此表中添加两列,以便我们对季度和年度平均资产净值进行统计。平均值是表上显示的每个月第一天的资产净值。例如,2015 年第一季度平均资产净值将是 2015 年 2 月 2 日和 2015 年 3 月 2 日的平均资产净值(而不是这些月份每天的资产净值平均值),而 2015 年平均资产净值将是2015 年 2 月 2 日、2015 年 3 月 2 日、2015 年 4 月 7 日和 2015 年 5 月 7 日。我希望最终结果如下所示:

+------------+----------+---------+---------+------+-------------+-------------+
|    Date    |   NAV    |  YrMn   |  YrQt   |  Yr  | QtAvgBegNAV | YrAvgBegNAV |
+------------+----------+---------+---------+------+-------------+-------------+
| 2/2/2015   | 20201975 | 2015-02 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 2/5/2015   | 20238246 | 2015-02 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 2/6/2015   | 20220397 | 2015-02 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 3/2/2015   | 25597902 | 2015-03 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 3/3/2015   | 25218728 | 2015-03 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 3/5/2015   | 25332618 | 2015-03 | 2015-Q1 | 2015 |    22899939 |    25396136 |
| 4/7/2015   | 25418590 | 2015-04 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 4/8/2015   | 25641822 | 2015-04 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 4/9/2015   | 25554811 | 2015-04 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 5/7/2015   | 30366075 | 2015-05 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 5/11/2015  | 30682382 | 2015-05 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 5/12/2015  | 30302426 | 2015-05 | 2015-Q2 | 2015 |    27892333 |    25396136 |
| 8/23/2016  | 33089750 | 2016-08 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 8/24/2016  | 32927879 | 2016-08 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 8/29/2016  | 32788338 | 2016-08 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 9/23/2016  | 32027027 | 2016-09 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 9/26/2016  | 31610061 | 2016-09 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 9/27/2016  | 31730128 | 2016-09 | 2016-Q3 | 2016 |    32558389 |    31979673 |
| 10/26/2016 | 31585115 | 2016-10 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 10/27/2016 | 31222400 | 2016-10 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 10/28/2016 | 31148585 | 2016-10 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 11/1/2016  | 31216799 | 2016-11 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 11/2/2016  | 31112343 | 2016-11 | 2016-Q4 | 2016 |    31400957 |    31979673 |
| 11/3/2016  | 30572465 | 2016-11 | 2016-Q4 | 2016 |    31400957 |    31979673 |
+------------+----------+---------+---------+------+-------------+-------------+

有没有办法做到这一点?我可以得到正确的数字,但我不知道如何把它们放在桌子上。例如,这给了我每年的平均值:

WITH A AS
(
    SELECT
        s.Date, s.NAV,s.YrMn, s.YrQt, s.Yr, 
        ROW_NUMBER() OVER (PARTITION BY YrMn ORDER BY Date) AS Row
    FROM 
        Portfolio.DailyNAV s
)
SELECT
    Yr,
    CASE
       WHEN Yr = 2015 AND A.Row = 1 THEN AVG(NAV)
       WHEN Yr = 2016 AND A.Row = 1 THEN AVG(NAV)
       WHEN Yr = 2017 AND A.Row = 1 THEN AVG(NAV)
       WHEN Yr = 2018 AND A.Row = 1 THEN AVG(NAV)
       ELSE AVG (NAV)
    END AS [YrAvgBegNAV]
FROM A
WHERE ROW = 1
GROUP BY Yr, Row

但是这并不有效,因为我必须每年更新代码(或者在季度数据的情况下每个季度)。此外,我将需要所有这些数据的多个连接和视图,因此我认为将它们全部放在桌面上是有意义的。如果可能,我想通过添加季度和年度平均数据列(作为计算列)来更改我的原始表。

【问题讨论】:

  • 不清楚:是否要添加列并进行一次性更新以填充它们?还是要创建计算列?
  • 我想创建计算列
  • 是通过视图还是硬编码
  • 它将被硬编码。我正在尝试遵循 Tab 的建议并想出一个 UDF

标签: sql-server average calculated-columns


【解决方案1】:

我会通过为每个计算列创建一个用户定义的函数来实现这一点,该函数采用表的唯一键(根据您的示例数据看起来像 Date 列)并查询表以获取计算值行,并将该函数的返回值用于我的计算列。

所以QtAvgBegNAV 的计算类似于= dbo.GetQtAvg([date])

dbo.GetQtAvg() 函数将运行一个查询,返回传递给它的日期的 Qt 平均值 NAV

【讨论】:

  • 谢谢。我会尝试这样做。
猜你喜欢
  • 1970-01-01
  • 2019-07-02
  • 1970-01-01
  • 2018-12-20
  • 2013-12-02
  • 1970-01-01
  • 1970-01-01
  • 2014-08-31
相关资源
最近更新 更多