滞后以获取自前一个空值以来的第一个非空值

Fra*_*ldi 5 sql lag window-functions amazon-redshift

下面是我试图在 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
Run Code Online (Sandbox Code Playgroud)

我已经尝试过 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
Run Code Online (Sandbox Code Playgroud)

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

Jon*_*ott 2

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

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

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  )
;
Run Code Online (Sandbox Code Playgroud)

然后运行这段代码

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;
Run Code Online (Sandbox Code Playgroud)