根据安全性计算4季度的平均值



为了简化我的问题,假设我有一个季度日期和销售编号表。

montr_end_date,id,sales

我需要计算每个ID的4季度销售平均值。我试图做以下操作:

-- CALCULATE FOUR QUARTER AVERAGES
-- CREATE INDEX OF DATES
SELECT *, date_idx=RANK() OVER(PARTITION BY ID ORDER BY month_end_date)
INTO #Temp_Date_Index
FROM #Temp_industrials
GO
CREATE INDEX idx_1 on #Temp_Date_Index(ID, date_idx)
GO
-- CALCULATE MOVING AVERAGE
SELECT MAX(month_end_date), ID, Sales_avg=AVG(Sales)
INTO #Temp_4Q_Avgs
FROM #Temp_Date_Index
WHERE date_idx>=4 AND (date_idx BETWEEN date_idx AND (date_idx-4))
GROUP BY ID

创建日期索引的第一步工作正常,但是"计算移动平均线"部分使我有一个错误"对象或列名称或空名称"。如果我从选择行中取出MAX(month_end_date),则不会出错,但给我一个空表结果。

也许我的方法从根本上存在缺陷。

事先感谢您的任何帮助。

还尝试使用子查询:

SELECT end_of_period=MAX(month_end_date), ID, 
op_inc_avg=AVG(
SELECT r.Sales
FROM #Temp_Date_Index r
WHERE r.date_idx BETWEEN l.date_idx AND (l.date_idx-3)
)

来自#temp_date_index l其中r.date_idx> = 4ID组

但是我得到了

msg 156,第15级,状态1,第3行关键字" select"附近的错误语法。MSG 102,15级,状态1,第6行不正确的语法附近')'。

我的同事向我展示了如何做:

-- CALCULATE FOUR QUARTER AVERAGES
-- CREATE INDEX OF DATES
DROP TABLE #Temp_Date_Index
GO
SELECT *, date_idx=RANK() OVER(PARTITION BY gvkey ORDER BY month_end_date)
INTO #Temp_Date_Index
FROM #Temp_industrials
GO
CREATE INDEX idx_1 on #Temp_Date_Index(gvkey, date_idx)
GO
-- CALCULATE MOVING AVERAGE
DROP TABLE #Temp_4Q_Avgs
GO
SELECT l.gvkey, l.date_idx, mov_avg=AVG(r.op_inc_ratio)
INTO #Temp_4Q_Avgs
FROM #Temp_Date_Index l, #Temp_Date_Index r
WHERE r.gvkey=l.gvkey AND (r.date_idx BETWEEN (l.date_idx-3) AND l.date_idx)AND        r.date_idx>=4
GROUP BY l.gvkey, l.date_idx
GO
CREATE INDEX idx_1 on #Temp_4Q_Avgs(month_end_date, gvkey)
GO

希望别人可以受益。

最新更新