2013-10-28 70 views
1

我試圖找到表中的每一行與其前一行之間的區別。如何在Oracle SQL中將一行與其前一行進行比較?

當我說不同時,我的意思是兩個值是否相同。

我不確定我是否需要for循環,而且如果表格有30到40列,這是否意味着我將不得不爲每個30-40列編寫檢查?

  • ROW1 - ID1 - 數據1 - 數據2 - 數據3 ..
  • 行2 - ID1 - 數據1 - 數據2 - 數據3 ..
  • ROW3 - ID2 - 數據1 - 數據2 - 數據3 ..
  • ROW4 - ID1 - 數據1 - 數據2 - 數據3 ..

    for i = 2 .. 3 
    is Row[i][data1] != Row[i-1][data1], Row[i][data2] != Row[i-1][data2].... 
    

這種檢查需要與同一非唯一ID的所有記錄工作要做。即。 ID1可以存在多個記錄。 帶ID1的行需要與ID1的其他行進行比較。

+0

你在訂購的?除非有'ORDER BY',否則沒有訂單。 –

+0

到目前爲止數據是在一個表中,有一個字段將用於排序數據。 一旦此過程/代碼完成運行,則必須輸出數據。 – CP3O

+0

如果這可以在SQL內完成,那就太好了。 – CP3O

回答

3

您可以使用Oracle lag analitic功能表。讓我們假設你的表是這樣的:

CREATE TABLE tbl (no int, id int, val1 int, val2 int) 

其中no是對數據進行排序的領域,id是你的非唯一標識符(組標識符),val1val2是價值觀。比你可以使用此查詢發現如果各行前一行在組重複:

select no, id, val1, val2, 
case when 
    lag(val1,1) over (partition by id order by no) = val1 and 
    lag(val2,1) over (partition by id order by no) = val2 
then 1 else 0 end duplicate 
from tbl 
order by no 

Here it is in SQLfiddle

+0

這真的很棒,但它在這裏檢查整行是否與前一行相同,我如何檢查一列或兩列是否與前一列不同? 也就是說。我沒有看到每行是否與前一行相同,我需要檢查哪些字段不等於前一行的字段。 – CP3O

+0

'INTO TBL(沒有,ID,VAL1,VAL2) \t \t VALUES(2,1,3,3) \t INTO TBL(沒有,ID,VAL1,VAL2) \t \t VALUES(3,1,3, 4)' 使用上述語句。 我有第一個'val1' =第二個'val1'即。 '3 == 3', 但是第一個'val2!='第二個'val2'即。 '3!= 4', 我該如何檢測? – CP3O

+0

也許這樣 - http://sqlfiddle.com/#!4/cebe7/1? –

0

試試這個!

比較它自己的PK的

select t1.value - t2.value from table t1, table t2 
    where t1.primaryKey = t2.primaryKey - 1 
相關問題