如何简化Spark SQL语句实现开放ST(ST后无RW任务)分类?
简洁实现方案
可以直接通过窗口函数替代原有衍生列的逻辑,直接在CASE WHEN中判断当前ST任务之后是否存在任何RW任务,避免提前生成冗余列,同时逻辑更准确(原有逻辑仅判断下一个任务是否为RW,无法覆盖后续多个任务的场景):
SELECT *, CASE WHEN code_task = 'ST' AND lastvalue = 'CR' -- 判断当前item分区内,当前任务之后是否没有任何RW任务 AND MAX(CASE WHEN code_task LIKE '%RW%' THEN 1 ELSE 0 END) OVER (PARTITION BY item ORDER BY task_time ROWS BETWEEN CURRENT ROW AND UNBOUNDED FOLLOWING) = 0 THEN 'ST' END AS `Open ST` FROM your_table
逻辑说明
- 窗口函数
MAX(CASE WHEN code_task LIKE '%RW%' THEN 1 ELSE 0 END)会在每个item的分区内,从当前任务开始到最后一个任务的范围内,检查是否存在RW任务:- 如果存在,返回1;如果不存在,返回0
- 仅当当前任务是ST、
lastvalue为CR,且后续无任何RW任务时,标记为Open ST
如果你的分区排序依赖的不是task_time,替换为实际的任务顺序字段即可。
内容的提问来源于stack exchange,提问作者NPC
相关产品推荐
相关产品推荐

