2014-07-23 41 views
0

我使用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」指標,因爲它包含一個或多個子查詢。考慮將視圖更改爲僅使用連接而不是子查詢。或者,考慮不索引這個視圖。

如何避免此子查詢並將索引視圖與最新預測進行索引?

+0

也許我錯過了什麼,但沒有任何理由,爲什麼你不能索引時間戳列(DESC或ASC,它不應該的問題)和覆蓋其他人(Forecast_ID,Budget_Code,IAM_ID,Forecast),然後執行「TOP WITH TIES」和「ORDER BY」。 – g2server

+0

@ g2server我不認爲'TOP WITH TIES'可以工作(但我不是很熟悉它),因爲每個時間戳都可以有一到多行(請參閱我的示例中的預算代碼00-0001) – Alex

+0

還可以我明白了,我錯過了分組。在那種情況下,我認爲medhi的方法會起作用(但是改爲RANK()並嘗試Timestamp上的索引,用查詢替換索引視圖 - 如果索引設置正確,性能應該類似)。 – g2server

回答

0

您不能在索引視圖中使用子查詢。我建議使用以下具有更好的性能,而不是你的查詢查詢:

SELECT * 
FROM (
    SELECT Forecast_ID, 
      Budget_Code, 
      Forecast, 
      ROW_NUMBER() OVER (PARTITION BY Budet_Code ORDER BY Timestamp DESC) row 
    FROM dbo.[Plan] p1 
    )z 
WHERE Z.row=1 
+1

感謝您的回答,但我忘了說我可以使用相同的時間戳獲得多個預測,並且如果時間戳是此Budget_Code的最後一個,我需要獲取所有這些預測。順便說一下,我在我的示例 – Alex

+0

@Alex中添加了另一列,將ROW_NUMBER()更改爲RANK()應該可以解決此問題。 – g2server

+0

@ g2server事實上,它適用於RANK(),但我仍然無法在索引視圖中使用它:/錯誤:「無法在視圖上創建索引」dbo.LastForecasts「,因爲它包含排名或聚合窗口函數。 – Alex