2017-04-15 34 views
0

此查詢在使用Oracle作爲我的後端時提供了期望的結果。如何在interbase中編寫sql LEAD()和LAG()查詢?

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數據庫,因爲分析功能lag()lead()尚未InterBase6支持面臨的問題。

我的要求是,如果array field2={1,3,4,4,3,4},那麼我應該得到的結果爲{1,3,4,3,4}

+0

找到考慮切換到火鳥3,[它支持'lead'和'lag'](http://firebirdsql.org/file /documentation/release_notes/html/en/3_0/rnfb30-dml-windowfuncs.html#d0e6678)。順便說一句,你仍然在Interbase 6上?那是在17年前發佈的...大約在那時Firebird 0.x是從Interbase 6中分離出來的。 –

+0

@ Ashish4434 - 我發現問題仍然存在。如果你對任何答案都滿意,那麼就「接受」它,這樣問題就可以結束。閱讀[當某人回答我的問題時該怎麼辦](http://stackoverflow.com/help/someone-answers)。也嘗試關閉以前的問題。 – Utsav

回答

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 
    

例如這個查詢的輸出會是這樣,這是你需要複製鉛功能的東西。對於相同的

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