2017-07-27 72 views
0

我有一個包含三個字段的表:Top(int),Left(int),Text(varchar)。如何在MSSQL中選擇行索引

表中的數據如下:

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 

我想所有的 「文本」 where (X - previous X) < 10 and (Y - previous Y) < 10

在這種情況下,結果應該是:B,C,F,M, Z

可以用SQL來做到這一點嗎?

預先感謝您

+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

您可以使用滯後,如果是下面的SQL Server> = 2012:

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

好吧,我會創建row_number字段,並嘗試,並讓你知道resaled –