比较记录集中的2个连续行

时间:2010-10-28 07:32:26

标签: sql oracle compare

目前,我有这个目标要见面。我需要查询数据库以获得某些结果。完成后,我需要比较记录: 例如:查询返回10行记录,然后需要比较:第1行为2,第2行为3,第3行为4 ...第9行为10。

我希望得到的最终结果是10行或少于10行记录。

我目前有一种方法。我在一个函数中执行此操作,手中的变量称为“previous”和“current”。在循环中,我将始终比较使用游标在记录集中填充的先前和当前。

在我获得每行过滤结果后,我会将其输入到物理临时表中。 所有结果都在此临时表中。我将对此表进行查询,并将结果插入游标,然后返回游标。

问题是:我怎么能不使用临时表。我在网上搜索有关使用嵌套表的信息,但不知怎的,我无法让它工作。

如何用其他东西替换临时表?或者是否有其他方法可用于比较行列与其他行。

修改

很抱歉,也许我不清楚我的问题。以下是我想要实现的结果示例。

表X

Column A    B       C       D
   100      300     99      T1
   100      300     98      T2
   100      300     97      T3
   100      100     97      T4
   100      300     97      T5
   101      11      11      T6

ColumnA是表格的主键。 ColumnA具有重复项,因为表X是一个审计表,用于记录所有更改。列D充当该记录的时间戳。

对于我的查询,我只对A,B和D列的更改感兴趣。在查询之后我想得到如下结果:

Column A    B       D
   100      300     T1
   100      100     T4
   100      300     T5
   101      11      T6

5 个答案:

答案 0 :(得分:6)

我认为Google Analytics可能会做您想做的事情:

select col1, col2, last(col1) over (order by col1, col2) LASTROWVALUE
from table1

这样,LASTROWVALUE将包含最后一行的de1值col1,您可以直接将其与当前行的col1进行比较。

查看此网址以获取更多信息:http://www.orafaq.com/node/55

答案 1 :(得分:4)

SELECT ROW_NUMBER() OVER(ORDER BY <Some column name>) rn,
      Column1, <Some column name>, CompareColumn,
      LAG(CompareColumn) OVER(ORDER BY <Some column name>) PreviousValue,
      LEAD(CompareColumn) OVER(ORDER BY <Some column name>) NextValue,
      case       
          when CompareColumn != LEAD(CompareColumn) OVER(ORDER BY <Some column name>)  then CompareColumn||'-->'||LEAD(CompareColumn) OVER(ORDER BY <Some column name>)
          when CompareColumn = LAG(CompareColumn) OVER(ORDER BY <Some column name>) then 'NO CHANGE'        
          else 'false'     
      end  
FROM <table name>

您可以在循环中使用此逻辑来改变行为。

答案 2 :(得分:1)

嗨,目前还不是很清楚你想要完成什么。但也许您可以在PL SQL集合中获取原始查询的结果并使用它来进行比较。

答案 3 :(得分:1)

你究竟在做什么行比较?您是想要消除重复,还是将数据转换为另一种形式然后返回?

要消除重复项,请在SELECT中使用GROUP BY或DISTINCT功能。

如果您正在迭代初始数据并以某种方式对其进行转换,那么在不使用临时表的情况下很难做到这一点 - 但是您对临时表的问题究竟是什么?如果你担心游标的性能,那么也许你可以做一个外部SELECT来比较两个内部SELECT的结果 - 但诀窍是第二个SELECT偏移了一行,所以你实现了比较第1行的要求反对row2等。

答案 4 :(得分:1)

我认为你使用临时表使事情变得复杂。 它可以使用游标和2个临时变量来创建。 这是伪代码:

declare

v_temp_a%xyz;
v_temp_b%xyz;
i number;
cursor my_cursor is select xyz from xyz;

begin

i := 1;

for my_row in my_cursor loop
if (i = 1)
v_temp_a := my_row;
else
v_temp_b := v_temp_a;
v_temp_a := my_row;

/* at this point v_temp_b has the previous row and v_temp_a has the currunt row
compare them and put whatever logic you want */

end if

i := i + 1;

end loop

end