目前,我有这个目标要见面。我需要查询数据库以获得某些结果。完成后,我需要比较记录: 例如:查询返回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
答案 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