2016-12-27 31 views
2

我不熟悉在SQL Server 2012中使用Lead/Lag函數,當我在SQL Server Management Studio中測試時遇到語法錯誤。我使用lead和lag函數來獲取上一行和下一行值。在SQL Server 2012中使用Lead/Lag函數獲取語法錯誤

SQL語法我使用:

SELECT 
    Id, Name, Address, Age, Nationality, 
    LEAD(Name, 1) OVER (ORDER BY Id) LeadValue, 
    LAG(Name, 1) OVER (ORDER BY Id) LagValue 
FROM 
    Table 

錯誤消息:

消息156,級別15,狀態1,行4
附近有語法錯誤關鍵字 '表'。

請告知我在這裏錯過了什麼。謝謝

+4

嘗試包裹在這樣的括號中的字'table':'[表]'。 'Table'是T-SQL中的一個保留字,用於像'alter table ..'或'drop table ...'這樣的命令。 – tarheel

+2

同樣你不會用任何語言的名稱'function'調用一個變量,你不應該調用一個表'table'。雖然合法,但與最佳做法相差180度。 – FDavidov

+0

@tarheel - 當我包裝我的表格對象像這樣[Table]後,它不會返回任何值。它返回null。我需要重命名我的表嗎?有什麼想法嗎? – timmack

回答

2

表是keyword。請避免使用保留字關鍵字

如果您的表具有名稱表,請添加括號如[表]。

的保留字和關鍵字列表:在評論https://msdn.microsoft.com/en-us/library/ms189822(v=sql.110).aspx

第二個任務:

if object_id('tempdb..#Tmp') is not null drop table #Tmp 
select *, row_number() over (order by Id) RN 
into #Tmp 
from [Table] 

select t.* 
from #Tmp t, (select Id, max(RN) mx, min(RN) mi from #Tmp group by Id) f 
where t.Id = f.Id 
    and (f.mx = t.RN or f.mi = t.RN) 
+0

我現在開始工作了。但是,它會返回表中的所有數據及其「Lead」和「Lag Value」列。如果我只想返回選定行的上一行和下一行的兩行,我該怎麼做?我需要使用Where子句嗎?或者是否需要爲名稱列設置參數值? – timmack

+0

滯後和潛在客戶按順序獲取值,只添加新列,不過濾數據。爲了過濾,你必須使用where子句或連接。但是你也可以使用row_number。用row_number()覆蓋(按ID排序)插入臨時表並從該新列中選擇最小值和最大值。 – Deadsheep39

+0

使其更清晰。你可以改變你的回答,以瞭解你的評論建議嗎?謝謝 – timmack