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 的最后一个“预测”创建一个索引视图,即具有最高时间戳的预测(每个 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”上创建索引,因为它包含一个或多个子查询。考虑将视图更改为仅使用联接而不是子查询。或者,考虑不索引此视图。

如何避免此子查询并使用最新预测索引我的视图?

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