2017-07-27 2 views
0

Top(int)、Left(int)、Text(varchar)の3つのフィールドを含むテーブルがあります。私は、この場合には、すべての "テキスト" where (X - previous X) < 10 and (Y - previous Y) < 10MSSQLで行インデックスを選択する方法

結果を取得したい

Text  X  Y 

1  1000 250 

2  700 100 

A  618 300 

B  620 400 

C  625 405 

F  623 402 

D  400 410 

M  300 415 

Z  304 418 

次のようになります:

テーブル内のデータは以下の通りですB、C、F、M、 Z

SQLでこれを行うことは可能ですか?

は、それが以下のようにSQL Serverの> = 2012である場合は、ラグを使用することができ、事前に

+0

あなたはまだSQLを試してみましたか?はいの場合は、誰かがあなたを助けることができるようにここに貼り付けてください。 – Syfer

+0

参照 - https://stackoverflow.com/questions/710212/is-there-a-way-to-access-the-previous-row-value-in-a-select-statement – DanieleO

+0

列順はどうですか? –

答えて

1

ありがとう:列で

Select * from (
    Select *,PrevX = lag(X) over(order bY [Text]), 
     PrevY= lag(Y) over(order by [Text]) from yourtable 
) a 
where a.x-a.prevx < 10 and a.y-a.prevy <10 

しかし、ここでは順序が正しいことが必要です。確かにあなたは、同一性を有するか、あなたは以下のように試すことができますが、SQL Server 2008の

によって順番に使用できる列をソートされます。

;With cte as (
    Select *,RowN = Row_Number() over(order bY [Text])) from yourtable 
) Select * from cte c1 
left Join cte c2 
on c1.RowN = C2.RowN-1 
where c1.x-c2.X < 10 and C1.y-c2.y <10 
+0

私は良いアイデアだと思いますが、今私はSQL Server 2008 R2を使用しています、実際にアップグレードする良い動機ですMSSQL 2012を試してみて –

+0

SQL Server 2008の場合は、row_numberを実行してrow_number -1と自己結合する必要があります。 –

+0

OK row_numberフィールドを作成して試してみましょう。 –

関連する問題