我使用SQL Server 2008.我有以下表格「預測」。如何避免此子查詢並創建索引視圖?
Forecast_ID | Budget_Code | IAM_ID | Forecast | Timestamp
1 | 00-0001 | 24 | 123.41 | '01-01'2010'
2 | 00-0001 | 10 | 111.41 | '02-02'2010' //Is Last
3 | 00-0001 | 44 | 457.10 | '02-02'2010' //Is Last
4 | 00-0002 | 258 | 20 | '01-05'2011' //Is Last
5 | 00-0003 | 3 | 215 | '11-12'2013' //Is Last
6 | 00-0003 | 31 | 85.2 | '10-01'2010'
7 | 00-0003 | 2 | 15 | '10-01'2010'
我試着用每個Budget_Code,i的最後一個「預測」創建一個索引視圖。即具有最高時間戳的預測(每個Budget_Code一個或多個行)。
所以我做了以下查詢:
CREATE VIEW LastForecasts
WITH SCHEMABINDING
AS
SELECT Forecast_ID, Budget_Code, IAM_ID, Forecast
FROM dbo.[Plan] p1
WHERE Timestamp = (
SELECT MAX(Timestamp)
FROM dbo.[Plan] p2
WHERE p1.Budget_Code = p2.Budget_Code)
GO
CREATE UNIQUE CLUSTERED INDEX IDX_V1
ON LastForecasts (Forecast_ID);
GO
但我有以下錯誤:
不能創建視圖「OperationPlanDB.dbo.LastForecasts」指標,因爲它包含一個或多個子查詢。考慮將視圖更改爲僅使用連接而不是子查詢。或者,考慮不索引這個視圖。
如何避免此子查詢並將索引視圖與最新預測進行索引?
也許我錯過了什麼,但沒有任何理由,爲什麼你不能索引時間戳列(DESC或ASC,它不應該的問題)和覆蓋其他人(Forecast_ID,Budget_Code,IAM_ID,Forecast),然後執行「TOP WITH TIES」和「ORDER BY」。 – g2server
@ g2server我不認爲'TOP WITH TIES'可以工作(但我不是很熟悉它),因爲每個時間戳都可以有一到多行(請參閱我的示例中的預算代碼00-0001) – Alex
還可以我明白了,我錯過了分組。在那種情況下,我認爲medhi的方法會起作用(但是改爲RANK()並嘗試Timestamp上的索引,用查詢替換索引視圖 - 如果索引設置正確,性能應該類似)。 – g2server