假设我有下表:
CREATE TABLE Portfolio.DailyNAV
(
Date date NOT NULL,
NAV int NOT NULL,
)
GO
日期列具有从“2015-02-02”开始的每日营业日,并且NAV列具有该日的总资产价值。我想获得四分之一的平均资产净值。对于这个例子,让我们假设我想在2016年第二季度得到它。我的代码现在是:
Select AVG(NAV) As AvgNAV
FROM Portfolio.DailyNAV
WHERE year(Date) = '2016' AND DATEPART(QUARTER,Date) = '2'
GO
我面临的问题是此代码计算该季度的每日平均值,但平均净资产值应仅使用该季度每个月的第一个营业日期计算。因此,对于2016年第二季度,平均资产净值应该是2016-04-01,2016-05-02(第一个不是工作日)和2016-06-01的平均值。我不想简单地更改我的WHERE子句并使用这些日期,因为我想制作一个存储过程,用户可以通过放入年份和季度来获得平均资产净值。
感谢。
答案 0 :(得分:3)
这应该有效:
WITH CTE AS
(
SELECT *,
RN = ROW_NUMBER() OVER( PARTITION BY CONVERT(VARCHAR(6),[Date],112)
ORDER BY [Date])
FROM Portfolio.DailyNAV
WHERE YEAR([Date]) = 2016
AND DATEPART(QUARTER,[Date]) = 2
AND NAV IS NOT NULL
)
SELECT AVG(NAV) AvgNAV
FROM CTE
WHERE RN = 1;