2016-12-27 9 views
2

SQL Server 2012でLead/Lag関数を使用するのが初めてで、SQL Server Management Studioでテストしたときに構文エラーが発生しました。私は前と次の行の値を取得する目的で先導機能を使用しました。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'は' alter table ..'や 'drop table ...'のようなコマンドのためにT-SQLの予約語です。 – 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

2番目のタスクは: `[テーブル]`:

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

私は今働いている。ただし、表のすべてのデータを「リードおよびラグ値」列とともに返します。選択した行の前の行と次の行の2つの行を返すだけの場合はどうしますか?これにWhere句を使用する必要がありますか?または名前列にパラメータ値を設定する必要がありますか? – timmack

+0

ラグとリードはorder by節の値を取得し、新しい列のみを追加し、データをフィルタリングしません。フィルタリングのためにwhere句を使用するかjoinする必要があります。しかし、row_numberも使用できます。 row_number()でtempテーブルに挿入し、この新しい列からminとmaxを選択します。 – Deadsheep39

+0

明確にする。お返事をあなたのコメントが示唆した通りに変更してもよろしいですか?ありがとう – timmack

関連する問題