SQL - 计算每个季度年初至今的平均值
SQL - Calculating YTD averages for each quarter
我正在尝试计算每个季度的年初至今平均值。例如:
- Q1 应显示 Q1 数据的平均值
- Q2 应显示 Q1 和 Q2 数据的平均值
- Q3 应显示 Q1、Q2 和 Q3 的平均值
- 第 4 季度应显示所有季度的平均值。
它还需要处理多年。因此,如果我的数据看起来像这样,我希望添加标记为 YTD_AVG
的最后一列
<--- I already have these ----> Need this field
Date | YEAR_QTR | VALUE | YTD_AVG
1/1/2019 2019Q1 10 11
1/6/2019 2019Q1 5 11
2/20/2019 2019Q1 18 11
4/10/2019 2019Q2 7 10 <-- average of Q1 and Q2
6/10/2019 2019Q2 10 10
8/11/2019 2019Q3 25 15 <-- average of Q1, Q2 and Q3
9/1/2019 2019Q3 20 15
9/20/2019 2019Q3 25 15
等等
然后当年份变为 2020 年时,它需要能够知道在 2020 年第一季度重新开始。
我试图按照以下方式做一些事情:
SELECT a.*
, YTD_QTR = AVG(VALUE) OVER (PARTITION BY [YEAR],YEAR_QTR)
FROM(
SELECT [DATE]
, YEAR_QTR
, datepart(year, COB_DATE) as [YEAR]
, VALUE
FROM #TABLE ) a
任何指导将不胜感激!
这可以通过 CROSS APPLY 运算符完成(我认为它在 SQL Server 2012 中可用)。看到这个答案:
但是你的YEAR_QTR
栏是不是错了,2019-10-20 = Quarter 4 对吗?
DECLARE @ValuesTable TABLE (
[Date] DATE,
YEAR_QTR VARCHAR(6),
[VALUE] INT
);
INSERT INTO @ValuesTable
(
Date,
YEAR_QTR,
VALUE
)
SELECT '2019-01-01','2019Q1',10 UNION ALL
SELECT '2019-01-06','2019Q1',5 UNION ALL
SELECT '2019-02-20','2019Q1',18 UNION ALL
SELECT '2019-04-10','2019Q2',7 UNION ALL
SELECT '2019-06-10','2019Q2',10 UNION ALL
SELECT '2019-08-11','2019Q3',25 UNION ALL
SELECT '2019-09-01','2019Q3',20 UNION ALL
SELECT '2019-10-20','2019Q3',25
/*
Final output
*/
SELECT
[Date],
DATEPART(QUARTER,Date) [Quarter],
VT.YEAR_QTR,
[VALUE],
YTD_AVG.YTD_AVG
FROM @ValuesTable VT
CROSS APPLY(
SELECT
AVG(VT2.VALUE) YTD_AVG
FROM @ValuesTable VT2
WHERE
YEAR(VT.Date) = YEAR(VT2.Date) AND
DATEPART(QUARTER,VT2.Date) <= DATEPART(QUARTER,VT.Date)
)YTD_AVG
我正在尝试计算每个季度的年初至今平均值。例如:
- Q1 应显示 Q1 数据的平均值
- Q2 应显示 Q1 和 Q2 数据的平均值
- Q3 应显示 Q1、Q2 和 Q3 的平均值
- 第 4 季度应显示所有季度的平均值。
它还需要处理多年。因此,如果我的数据看起来像这样,我希望添加标记为 YTD_AVG
的最后一列 <--- I already have these ----> Need this field
Date | YEAR_QTR | VALUE | YTD_AVG
1/1/2019 2019Q1 10 11
1/6/2019 2019Q1 5 11
2/20/2019 2019Q1 18 11
4/10/2019 2019Q2 7 10 <-- average of Q1 and Q2
6/10/2019 2019Q2 10 10
8/11/2019 2019Q3 25 15 <-- average of Q1, Q2 and Q3
9/1/2019 2019Q3 20 15
9/20/2019 2019Q3 25 15
等等
然后当年份变为 2020 年时,它需要能够知道在 2020 年第一季度重新开始。
我试图按照以下方式做一些事情:
SELECT a.*
, YTD_QTR = AVG(VALUE) OVER (PARTITION BY [YEAR],YEAR_QTR)
FROM(
SELECT [DATE]
, YEAR_QTR
, datepart(year, COB_DATE) as [YEAR]
, VALUE
FROM #TABLE ) a
任何指导将不胜感激!
这可以通过 CROSS APPLY 运算符完成(我认为它在 SQL Server 2012 中可用)。看到这个答案:
但是你的YEAR_QTR
栏是不是错了,2019-10-20 = Quarter 4 对吗?
DECLARE @ValuesTable TABLE (
[Date] DATE,
YEAR_QTR VARCHAR(6),
[VALUE] INT
);
INSERT INTO @ValuesTable
(
Date,
YEAR_QTR,
VALUE
)
SELECT '2019-01-01','2019Q1',10 UNION ALL
SELECT '2019-01-06','2019Q1',5 UNION ALL
SELECT '2019-02-20','2019Q1',18 UNION ALL
SELECT '2019-04-10','2019Q2',7 UNION ALL
SELECT '2019-06-10','2019Q2',10 UNION ALL
SELECT '2019-08-11','2019Q3',25 UNION ALL
SELECT '2019-09-01','2019Q3',20 UNION ALL
SELECT '2019-10-20','2019Q3',25
/*
Final output
*/
SELECT
[Date],
DATEPART(QUARTER,Date) [Quarter],
VT.YEAR_QTR,
[VALUE],
YTD_AVG.YTD_AVG
FROM @ValuesTable VT
CROSS APPLY(
SELECT
AVG(VT2.VALUE) YTD_AVG
FROM @ValuesTable VT2
WHERE
YEAR(VT.Date) = YEAR(VT2.Date) AND
DATEPART(QUARTER,VT2.Date) <= DATEPART(QUARTER,VT.Date)
)YTD_AVG