【问题标题】:How does one compare a row with its preceding row in Oracle SQL?如何在 Oracle SQL 中将一行与其前一行进行比较?
【发布时间】:2013-10-28 05:55:51
【问题描述】:

我试图找出表格中每一行与其前一行之间的差异。

当我说差异时,我的意思是两个值是否相同。

我不确定我是否需要一个 for 循环,而且如果表有 30 到 40 列,这是否意味着我必须为这 30-40 列中的每一列编写检查?

  • Row1 - ID1 - data1 - data2 - data3..
  • Row2 - ID1 - data1 - data2 - data3..
  • Row3 - ID2 - data1 - data2 - data3..
  • Row4 - ID1 - data1 - data2 - data3..

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

需要对具有相同非唯一 ID 的所有记录进行此检查。 IE。 ID1 可以存在多个记录。 ID1 的行需要与 ID1 的其他行进行比较。

【问题讨论】:

  • 您按什么订购?除非有ORDER BY,否则没有订单。
  • 到目前为止数据在一个表中,有一个字段将用于对数据进行排序。一旦这个程序/代码运行完毕,就必须输出数据。
  • 如果这可以在 SQL 中完成,那就太好了。
  • 你能发布一个包含示例数据和所需o/p 的表格吗?

标签: sql oracle comparison


【解决方案1】:

您可以使用 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

【讨论】:

  • 这真的很棒,但是这里它检查整行是否等于前一行,我将如何检查一两列是否与前一列不同? IE。看不到每一行是否等于上一行,需要检查哪些字段不等于上一行的字段。
  • INTO tbl (no, id, val1, val2) VALUES (2, 1, 3, 3) INTO tbl (no, id, val1, val2) VALUES (3, 1, 3, 4) 使用上述语句。我有第一个val1 = 第二个val1 即。 3 == 3,但第一个 val2 != 第二个 val2 即。 3 != 4,我如何检测到?
  • 或者像这样 - sqlfiddle.com/#!4/cebe7/2 ? (区别在于组中的第一行被认为所有列都已更改)
  • 我是否仅限于Then 1 else 0 或者有没有办法:then update tb1 set val1 = SomeValue else update tb1 set val1=NULL 顺便说一句,感谢您的帮助!我真的很感激!
  • @user1283103 你绝对不能在select里面做更新。但是您可以在更新的 where-caluse 中使用类似的结构。
【解决方案2】:

试试这个!!

将一个表与它自己的 PK 进行比较

 select t1.value - t2.value from table t1, table t2 
    where t1.primaryKey = t2.primaryKey - 1

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多