我使用SQL Server 2008.我有以下表格" Forecast"。
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'
我尝试创建一个带有持续时间的索引视图" Forecasts"根据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 :(得分: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