Databricks SQL:基于唯一值用LAG函数实现指定列计算需求
解决方案:替换number=8的行值为最近非8值加1
你的问题出在单纯使用LAG(number)只会取紧邻的前一行值,如果前一行也是8,就会得到错误的计算结果。要实现“取前一个非8的number值加1”的逻辑,需要在窗口函数中追踪每个id分组内最近的非8值,而非仅前一行值。
以下是符合要求的CASE语句实现:
SELECT id, number, CASE WHEN number = 8 THEN MAX(CASE WHEN number != 8 THEN number END) OVER ( PARTITION BY id ORDER BY number ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING ) + 1 ELSE number END AS value_needed FROM your_table;
代码说明:
MAX(CASE WHEN number != 8 THEN number END) OVER (...):在每个id分组内,筛选出当前行之前的所有非8值,通过MAX获取其中最后出现的那个值(即最近的非8值)。ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING:限定窗口范围为分组起始行到当前行的前一行,确保只参考当前行之前的数据。- 若需要让所有number=8的行
value_needed统一为3,只需保证每个id分组内最近的非8值为2,这段代码会自动计算出3。
注意:如果你的数据排序逻辑不是基于number列(比如按行的插入顺序),请将ORDER BY number替换为对应的排序字段,确保能正确追踪到前一个非8的行。
内容的提问来源于stack exchange,提问作者inspiredd
相关产品推荐
相关产品推荐

