0

当使用 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}

4

1 回答 1

1

我不知道,interbase但我可以给你点写一个查询来复制铅功能。你可以以此为基础。

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

  2. n现在找到一种方法,根据上面的顺序,在 interbase 中从 1 生成序列号。其中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
    

此查询的输出将是这样的,这是您复制前导函数所需要的。

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

于 2017-04-15T09:47:34.133 回答