[英]Calculate field based on previous calculated condition field
所以我正在研究一个涉及三列“行号”、“类型”、“因素”的解决方案。 基于此,我想生成列“factor_adj”。 我面临的问题是它取决于前一行的条件。 我一直在玩 window function,但似乎无法获得预期的结果。 我怎样才能做到这一点?
其伪逻辑如下:
IF "row number" == 1
then 1
ELSE IF Previous Type == 'related' then
Previous factor_adj*0.1
ELSE
Previous factor_adj*0.2
END
这是“factor_adj”的预期结果片段
+------------+---------+---------------+---------------+
| row number | type | factor | factor_adj |
+------------+---------+---------------+---------------+
| 1 | regular | 1 | 1 |
| 2 | regular | 0.6226 | 0.2 |
| 3 | regular | 0.4626319149 | 0.12452 |
| 4 | regular | 0.3492 | 0.09252638298 |
| 5 | regular | 0.2662688742 | 0.06984 |
| 6 | regular | 0.2038145695 | 0.05325377483 |
| 7 | regular | 0.1587655629 | 0.04076291391 |
| 8 | related | 0.1229311258 | 0.03175311258 |
| 9 | regular | 0.09119205297 | 0.1217018146 |
| 10 | regular | 0.06457218542 | 0.01823841059 |
+------------+---------+---------------+---------------+
对于测试和复制:
CREATE TABLE factor_test (
row_number integer,
"type" varchar(256),
"factor" float
)
insert into factor_test (row_number, "type", factor)
values (1, 'regular', 1),
(2, 'regular', 0.6226),
(3, 'regular', 0.4626319149),
(4, 'regular', 0.3492),
(5, 'regular', 0.2662688742),
(6, 'regular', 0.2038145695),
(7, 'regular', 0.1587655629),
(8, 'related', 0.1229311258),
(9, 'regular', 0.09119205297),
(10, 'regular', 0.06457218542);
我会将其添加为首发。 它与您的预期结果对应到相关行,您能否详细说明如何计算剩余的行?
select row_num, type, factor
, case when row_num = 1
then 1
when lag(type) over (order by row_num) = 'related'
then 0.1 * lag(factor) over (order by row_num)
else
0.2 * lag(factor) over (order by row_num)
end as factor_adj
from factor_test
通过显式声明 window 它会变得更短一些:
select row_num, type, factor
, case when row_num = 1 then 1
when lag(type) over w = 'related' then 0.1 * lag(factor) over w
else 0.2 * lag(factor) over w
end as factor_adj
from factor_test
window w AS (order by row_num)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.