2015-12-10 103 views
-1

我一直試圖從數據集中的先前記錄中獲取數據並使用該先前記錄中的一些數據。記錄與我的資產ID相關聯,我認爲我越來越接近,但我現在需要一些專家建議,才能克服最後的障礙。 下面是我提出的聲明,但我得到一個錯誤,我可以看到錯誤來自哪裏,但我不知道如何繞過它。 我的代碼是:SQL用戶定義的函數查找以前的記錄

SELECT location, 
(SELECT TOP (1) week_number 
FROM dbo.tbl_job_planning AS l2 
WHERE week_number < dbo.tbl_job_planning.week_number 
ORDER BY week_number DESC) AS prev_week 
FROM dbo.tbl_job_planning 
WHERE fleet_no = @fleet AND week_number = prev_week 
ORDER BY date_starting DESC 

的問題是,prev_week是不是在我的表中的實際列是「對飛」製作。請有人指出我正確的方向。

+0

[TSQL Query to reference previous rows]的可能重複(http://stackoverflow.com/questions/28553825/tsql-query-to-reference-previous-rows) –

回答

0

您可以使用帶fleet_no上的分區的ROW_NUMBER()窗口函數來訂購周。

這應該爲你工作:

;With WeekOrder As 
(
    Select *, Row_Number Over (Partition By fleet_no Order By week_number Asc) As Row_Number 
    From tbl_job_planning 
) 
Select  C.location, P.week_number As Prev_week 
From  WeekOrder C 
Left Join WeekOrder P On C.Row_Number - 1 = P.Row_Number 
          And C.fleet_no = P.fleet_no 
Where  C.fleet_no = @fleet 
Order By C.date_starting Desc 
1
WITH data_with_rn AS 
(
    SELECT location, fleet_no, week_number, 
     ROW_NUMBER() (PARTITION BY fleet_no, ORDER BY week_number DESC) as week_rn 
    FROM dbo.tbl_job_planning 
) 
SELECT base.location, base.date_starting, prior.week_number as prev_week 
FROM data_with_rn base 
LEFT JOIN data_with_rn prior ON prior.week_rn = base.week_rn - 1 AND base.fleet_no = prior.fleet_no 
WHERE base.fleet_no = @fleet 
ORDER BY base.date_starting DESC 
1

我想你應該避免通過LAG功能(可從SQL Server 2012)自加盟:

with WeekOrder AS (
    select C.location, C.fleet_no, C.date_starting, LAG(location, 1, NULL) OVER (Partition By fleet_no Order By week_number Asc) AS PrevLocation 
    FROM dbo.tbl_job_planning C 
) 
select * 
from WeekOrder C 
Where  C.fleet_no = @fleetNo 
    and PrevLocation IS NOT NULL 
Order By C.date_starting Desc 

此外,查詢有點小,應該有比自聯接版本更好的執行計劃。