2013-10-28 48 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 
相关问题