4

私は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 ごとの最後の「Forecasts」、つまりタイムスタンプが最も高い予測 (Budget_Code ごとに 1 つ以上の行) を含むインデックス付きビューを作成しようとしました。

だから私は次のクエリを行いました:

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

しかし、私は次のエラーがあります:

1 つ以上のサブクエリが含まれているため、ビュー "OperationPlanDB.dbo.LastForecasts" にインデックスを作成できません。サブクエリの代わりに結合のみを使用するようにビューを変更することを検討してください。または、このビューにインデックスを付けないことを検討してください。

このサブクエリを回避し、最後の予測でビューにインデックスを付けるにはどうすればよいですか?

4

1 に答える 1

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
于 2014-07-23T09:32:32.020 に答える