【问题标题】:lead / lag Oracle领先/落后甲骨文
【发布时间】:2019-12-05 07:18:45
【问题描述】:

我有一个字段(跟踪更改) 这只给我第一行的值,但想把它传递给下一行...

具有超前/滞后功能 - 不起作用

【问题讨论】:

  • should be 列中的26 值的来源是什么?
  • 你的预期输出是什么?

标签: sql oracle window-functions


【解决方案1】:

假设should be列中26值的来源是BC003,则可以使用Lead,如下所示:

With tab (BC003) as( Select 1 from dual
               UNION ALL
             Select 18 from dual
             UNION ALL
             Select 26 from dual)
Select BC003, NVL(Lead(BC003) over (Order by 1),BC003) "Shoud be"
from tab;

输出:

SQL> /

     BC003   Shoud be
---------- ----------
         1         18
        18         26
        26         26    

【讨论】:

    【解决方案2】:

    Oracle 设置

    CREATE TABLE test_data( id, object, bc003, track_change ) AS
    SELECT 121, 12,  1, 15   FROM DUAL UNION ALL
    SELECT 121, 13,  1, NULL FROM DUAL UNION ALL
    SELECT 121, 14,  1, NULL FROM DUAL UNION ALL
    SELECT 121, 15,  1, NULL FROM DUAL UNION ALL
    SELECT 121, 16,  1, NULL FROM DUAL UNION ALL
    SELECT 121, 12, 18, 22   FROM DUAL UNION ALL
    SELECT 121, 13, 18, NULL FROM DUAL UNION ALL
    SELECT 121, 14, 18, NULL FROM DUAL UNION ALL
    SELECT 121, 15, 18, NULL FROM DUAL UNION ALL
    SELECT 121, 16, 18, NULL FROM DUAL
    

    查询 1

    您可以使用解析函数:

    SELECT t.*,
           MIN( track_change ) OVER ( PARTITION BY id, bc003 ) AS track_change_new
    FROM   test_data t
    

    查询 2

    您可以将LAGIGNORE NULLS 子句一起使用:

    SELECT t.*,
           COALESCE(
             track_change,
             LAG( track_change ) IGNORE NULLS OVER (
               PARTITION BY id, bc003
               ORDER BY object
             )
           ) AS track_change_new
    FROM   test_data t
    

    输出

    两者输出相同:

    身份证 |对象 | BC003 |跟踪更改 | TRACK_CHANGE_NEW --: | -----: | ----: | ------------: | ---------------: 121 | 12 | 1 | 15 | 15 121 | 13 | 1 | | 15 121 | 14 | 1 | | 15 121 | 15 | 1 | | 15 121 | 16 | 1 | | 15 121 | 12 | 18 | 22 | 22 121 | 13 | 18 | | 22 121 | 14 | 18 | | 22 121 | 15 | 18 | | 22 121 | 16 | 18 | | 22

    db小提琴here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-05
      • 2011-07-19
      • 2014-09-11
      • 2011-06-15
      • 2020-06-10
      相关资源
      最近更新 更多