我有一个如下表。我正试图从列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
。谁会想到呢?:(