sql - 滞后获得自前一个空值以来的第一个非空值

标签 sql amazon-redshift lag window-functions

下面是我试图在 Redshift 数据库中实现的示例。

我有一个变量 current_value我想创建一个新列 value_desired那是:

  • current_value如果前一行为空
  • 如果前一行非空,则等于最后一个前一个非空值

  • 这听起来像是一项简单的任务,但我还没有找到方法来做到这一点。
    row_numb     current_value   value_desired
    1
    2
    3            47              47
    4
    5            45              45
    6
    7
    8            42              42
    9            41              42
    10           40              42
    11           39              42
    12           38              42
    13
    14           36              36
    15
    16
    17           33              33
    18           32              33
    

    我已经尝试过 LAG() 函数,但我只能获得以前的值(不是“非空”块中的第一个值),这是我的看法:
    SELECT *
        , CASE WHEN current_value is not null and LAG(current_value) is null THEN current_value
               WHEN current_value is not null and LAG(current_value) is not null 
                THEN LAG(current_value)
          ELSE NULL END AS value_desired
      FROM test1
    

    非常感谢任何帮助,谢谢。

    最佳答案

    这是正确的答案,它给出了正确的结果。
    这里有一些聪明的技巧,我建议你仔细看看,让我知道什么需要澄清

    根据您的问题创建测试数据。

    drop table if exists test_table ;
    create table test_table (row_num int,current_value int);
    insert into test_table(row_num, current_value)
    values
      (1,null),
    (2,null),
    (3,47),
    (4,null),
    (5,45),
    (6,null),
    (7,null),
    (8 ,42),
    (9 ,41),
    (10,40  ),
    (11,39 ),
    (12,38 ),
    (13,null),
    (14,36),
    (15,null),
    (16,null),
    (17 ,33),
    (18,32  )
    ;
    

    然后运行这段代码
    SELECT DISTINCT
      j1.row_num,
      CASE WHEN j1.current_value IS NULL
        THEN NULL
      ELSE
        last_value(j2.current_value)
        OVER (
          PARTITION BY j1.row_num
          ORDER BY j2.row_num
          ROWS BETWEEN UNBOUNDED PRECEDING AND UNBOUNDED FOLLOWING ) END AS value_desired
    FROM test_table AS j1
      LEFT JOIN (SELECT
                   row_num,
                   current_value,
                   lag(current_value, 1)
                   OVER (
                     ORDER BY row_num ) AS prev_cval
                 FROM test_table) AS j2
        ON j1.row_num >= j2.row_num AND j2.current_value IS NOT NULL
           AND j2.prev_cval IS NULL
    ORDER BY j1.row_num;
    

    关于sql - 滞后获得自前一个空值以来的第一个非空值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47407785/

    相关文章:

    mysql - 从两个表中选择数据

    amazon-web-services - 如何连接到 Amazon Redshift 或 Apache Spark 中的其他数据库?

    mysql - 从非常大的表中导出逗号分隔的数据

    amazon-redshift - Redshift - 如何显示 CASCADE 将删除的依赖项?

    Firefox 中的 Javascript setinterval() 滞后?

    php - 如何在一页中显示来自不同数据库表的数据

    php - 具有第一层子类别和第二层子类别的类别的 MySQL 规范化

    pseudocode - 区分延迟和正常延迟之间的区别?

    sql - 当我在同一列中具有不同格式的值时,如何获得相同的日期列值