SQL Server 2012:如何仅使用每月第一天的值来计算季度平均值

时间:2016-09-29 16:25:04

标签: sql-server tsql

假设我有下表:

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子句并使用这些日期,因为我想制作一个存储过程,用户可以通过放入年份和季度来获得平均资产净值。

感谢。

1 个答案:

答案 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;