eqs*_*qsf 5 sql t-sql sql-server
为了简化我的问题,假设我有一份按安全性划分的季度日期和销售数字表.
month_end_date,ID,Sales
我需要计算每个ID的销售额的四分之一移动平均值.我试着做以下事情:
-- 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
Run Code Online (Sandbox Code Playgroud)
创建日期索引的第一步工作正常,但"CALCULATE MOVING AVERAGE"部分给出了一个错误"对象或列名称丢失或为空".如果我MAX(month_end_date)从SELECT行中取出它没有错误地运行,但给了我一个空表结果.
也许我的方法存在根本缺陷.
在此先感谢您的帮助.
还尝试使用子查询:
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)
)
Run Code Online (Sandbox Code Playgroud)
FROM #Temp_Date_Index l WHERE r.date_idx> = 4 GROUP BY ID
但我得到了
消息156,级别15,状态1,行3关键字'SELECT'附近的语法不正确.消息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
Run Code Online (Sandbox Code Playgroud)
希望其他人能够受益。