【发布时间】: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