SQL如何取最近flag='n'行的col1值填充flag='y'的行?
问题原因
你之前使用的LAG(col1,1)只能获取相邻上一行的col1值,遇到连续多条flag='y'的场景时,第二条及之后的y行就会取到上一条y行的col1值,和你要取最近一条n行col1的需求不符。
实现方案
我们可以通过分组标记+组内取值的逻辑实现需求,步骤如下:
- 先按
ID分区、date升序排序,生成分组序号:每遇到一次flag='n',分组序号就+1,这样同一条n后面的所有连续y都会和这条n分到同一个组 - 在每个分组内,提取唯一一条flag='n'行的col1值,作为组内所有行的
col1_new即可
完整SQL代码
SELECT ID, col1, flag, date, MAX(CASE WHEN flag = 'n' THEN col1 END) OVER (PARTITION BY ID, group_id) AS col1_new FROM ( SELECT *, -- 生成分组序号,每遇到一个n就新增一个分组 SUM(CASE WHEN flag = 'n' THEN 1 ELSE 0 END) OVER ( PARTITION BY ID ORDER BY date ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS group_id FROM my_table ) t
逻辑验证
以你举的示例为例:
- 第4行flag为n,生成的group_id为N,第5、6行flag为y,group_id也为N,组内取到的col1就是第4行的col1
- 第9行flag为n,生成的group_id为N+1,第10、11行flag为y,group_id也为N+1,组内取到的col1就是第9行的col1
完全符合你的需求。
内容的提问来源于stack exchange,提问作者Tukki
相关产品推荐
相关产品推荐

