此查询在使用Oracle作为后端时提供了所需的结果。
select field1,
field2
from
(select field1,
field2,
LEAD(field2) over (order by r) name
from
(select rownum r,
field1,
field2
from t3
where field2 = 1
)
)
where v != nvl(name, -1);
但我在查询Interbase数据库时遇到问题,因为InterBase6不支持分析函数lag()
和lead()
。
我的要求是,如果是array field2={1,3,4,4,3,4}
,那么我应该得到{1,3,4,3,4}
的结果。
答案 0 :(得分:1)
我不知道interbase
但是我可以给你点数来写一个复制主导函数的查询。你可以在此基础上继续发展。
查找要按行排序的列。您在oracle查询中使用的rownum
不是正确的方法。由于您无法保证结果将始终以相同的顺序显示。因此,假设field1
是您要订购的列。
现在找到一种方法,根据上面的顺序在interbase中生成1 - n
的序列号。其中n
是您的总行数。所以你的样本表可能如下所示。
+-----+--------+--------+
| seq | field1 | field2 |
+-----+--------+--------+
| 1 | 101 | 1 |
| 2 | 102 | 3 |
| 3 | 103 | 4 |
| 4 | 104 | 4 |
| 5 | 105 | 3 |
+-----+--------+--------+
完成上述任务后,即将完成。您只需要进行自联接以复制超前或滞后功能。以下是lead
select t1.field1
,t1.field2
,t2.field1 as lead_field1
,t2.field2 as lead_field2
from table1 t1
left join
(select seq-1 as prev_seq,field1,field2
from table1) t2
on t1.seq=t2.prev_seq
此查询的输出将如下所示,这是复制主要功能所需的内容。
+--------+--------+-------------+-------------+
| field1 | field2 | lead_field1 | lead_field2 |
+--------+--------+-------------+-------------+
| 101 | 1 | 102 | 3 |
| 102 | 3 | 103 | 4 |
| 103 | 4 | 104 | 4 |
| 104 | 4 | 105 | 3 |
| 105 | 3 | NULL | NULL |
+--------+--------+-------------+-------------+
可以在
找到相同的样本