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)
非常感谢任何帮助,谢谢。
这是正确的答案,它给出了正确的结果。这里有一些巧妙的技巧,我建议你仔细看一下,让我知道哪些需要澄清
根据您的问题创建测试数据。
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)