如何用动态值来抵消滞后函数



我有一个如下表。我正试图从列activity_role派生列activity_role_adjusted。我尝试过使用lag(),但我的偏移是动态的。对于给定的分区,所需的值可以是上面一行或上面5行。

activity_role_adjusted:的逻辑

  • 如果activity_role <> 'Other',则activity_role

  • 如果activity_role = 'Other',则前几个月的最后一个值不等于"其他">

  • 如果上面的所有行都是"其他",则保留"其他">

对于每个员工,只有8行数据。1月至8月

employee_login abc abc abc abc abc abc abc

Redshift的窗口函数(包括lag()(支持IGNORE NULLS子句。你应该能够使用这个:

SELECT *
, CASE
WHEN activity_role = 'Other'
THEN COALESCE(lag(NULLIF(activity_role, 'Other')) IGNORE NULLS OVER (PARTITION BY employee_login ORDER BY to_timestamp('Feb', 'Mon'))
, 'Other')
ELSE activity_role
END AS activity_role_adjusted
FROM   tbl;

使用to_timestamp()将您尴尬的月份名称强制为我们可以订购的名称。(Reshift似乎没有更简单的to_date()。(

NULLIF()将"其他"替换为NULL,以这种方式跳过。

最后,如果我们没有找到其他内容,COALESCE()将默认为"其他"。

此外:
Redshift支持Postgres没有的标准SQL功能:IGNORE NULLS。谁会想到呢?:(

最新更新