我希望将当前计算值作为 Athena AWS 中的字段进行增量,这可以在 Qlik 中使用 peek() 函数实现,目标是在每个投资者或项目激活状态中创建和增量状态字段,这是我的数据:
项目 | 投资者 | 日期 | IS_ACTIF |
---|---|---|---|
P1 | I1 | 010124 | 1 |
P1 | I1 | 020124 | 1 |
P1 | I1 | 030124 | 0 |
P1 | I1 | 040124 | 1 |
P1 | I2 | 050124 | 1 |
P1 | I2 | 060124 | 0 |
这是期望的结果:
项目 | 投资者 | 日期 | IS_ACTIF | 状态 |
---|---|---|---|---|
P1 | I1 | 010124 | 1 | 1 |
P1 | I1 | 020124 | 1 | 1 |
P1 | I1 | 030124 | 0 | 2 |
P1 | I1 | 030124 | 1 | 3 |
P1 | I2 | 050124 | 1 | 1 |
P1 | I2 | 060124 | 0 | 2 |
如何使用 Athena SQL 实现此目标?
使用 QLIK:
STATE:
NoConcatenate
LOAD DISTINCT
PROJECT,
INVESTOR,
DATE,
IS_ACTIF,
IF(RowNo()=1 OR Previous(PROJECT&INVESTOR)<>PROJECT&INVESTOR,1,
IF( IS_ACTIF=Previous(IS_ACTIF)
,peek(STATE),peek(STATE)+1) ) AS STATE
RESIDENT DATA ORDER BY PROJECT, INVESTOR,DATE;
它并不是 Qlik 中
peek()
的实际替代品,但可以通过 Athena 中的窗口函数组合来完成:
SELECT PROJECT,
INVESTOR,
"DATE",
IS_ACTIF,
SUM(ABS(is_actif-lagged_actif)) OVER (PARTITION BY PROJECT, INVESTOR ORDER BY row_id) AS "STATE"
FROM
(
SELECT *, ROW_NUMBER() OVER(PARTITION BY PROJECT, INVESTOR) as row_id, LAG(is_actif,1, 0) OVER(PARTITION BY PROJECT, INVESTOR) as lagged_actif
FROM TEST_SO
) a
基本上,它对每个状态与其前一个状态之间的绝对差进行累积和。