繁体   English   中英

根据之前计算的条件字段计算字段

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM