2012-12-19 13 views
5

मेरे प्रश्न को सरल बनाने के लिए, मान लीजिए कि मेरे पास तिमाही तिथियों और सुरक्षा संख्याओं की सुरक्षा है।सुरक्षा द्वारा 4 क्वार्टर मूविंग एवरेज की गणना

month_end_date, आईडी, बिक्री

मैं आईडी प्रति बिक्री के 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 

दिनांकों के एक सूचकांक बनाने के लिए पहला कदम ठीक काम किया लेकिन "की गणना बढ़ औसत" हिस्सा मुझे एक त्रुटि "एक वस्तु या स्तंभ नाम है या खाली है" देता है। अगर मैं SELECT लाइन से 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 एल से कहां r.date_idx> = 4 ग्रुप आईडी

द्वारा लेकिन मैं संदेश 156

हो रही है, स्तर 15, राज्य 1, रेखा 3 कीवर्ड 'चयन' के पास गलत वाक्यविन्यास। संदेश 102, स्तर 15, राज्य 1, रेखा 6 ') के पास गलत वाक्यविन्यास।

+0

'SELECT MAX (month_end_date)' जैसे 'AS "maxValue" ' – Nico

+1

के बाद कॉलम नाम को परिभाषित करें, आपको' MAX (month_end_date) 'उपनाम देना होगा। यद्यपि यह आपको अभी भी एक खाली तालिका देगा परिणामस्वरूप – Lamak

+0

SQL सर्वर का कौन सा संस्करण आप उपयोग कर रहे हैं? –

उत्तर

3

मेरे सहयोगी मुझे दिखाया है कि कैसे यह करने के लिए:

-- 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 

आशा किसी और फायदा हो सकता है।

संबंधित मुद्दे