如何在interbase中编写sql LEAD()和LAG()查询?

时间:2017-04-15 05:45:50

标签: sql lag interbase lead

此查询在使用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}的结果。

1 个答案:

答案 0 :(得分:1)

我不知道interbase但是我可以给你点数来写一个复制主导函数的查询。你可以在此基础上继续发展。

  1. 查找要按行排序的列。您在oracle查询中使用的rownum不是正确的方法。由于您无法保证结果将始终以相同的顺序显示。因此,假设field1是您要订购的列。

  2. 现在找到一种方法,根据上面的顺序在interbase中生成1 - n的序列号。其中n是您的总行数。所以你的样本表可能如下所示。

    +-----+--------+--------+
    | seq | field1 | field2 |
    +-----+--------+--------+
    |   1 |    101 |      1 |
    |   2 |    102 |      3 |
    |   3 |    103 |      4 |
    |   4 |    104 |      4 |
    |   5 |    105 |      3 |
    +-----+--------+--------+
    
  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
    
  4. 此查询的输出将如下所示,这是复制主要功能所需的内容。

    +--------+--------+-------------+-------------+
    | 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        |
    +--------+--------+-------------+-------------+
    

    可以在

    找到相同的样本

    http://rextester.com/IJIU40428