求Databricks SQL查询语句:按规则生成C1列
Databricks SQL 实现分组填充C1列需求
需求描述
在同一ID、COMPANY、DEPT组合的分组内:
- 当
FLAG为F时,C1取该行的INDICATOR值 - 该
C1值需持续填充到下一个FLAG=F的行出现前的所有行
原始数据表
| ID | COMPANY | DEPT | FLAG | INDICATOR |
|---|---|---|---|---|
| 1 | A | HR | F | 2 |
| 1 | A | HR | P | 3 |
| 1 | A | HR | M | 4 |
| 1 | A | HR | F | 5 |
| 1 | A | HR | P | 6 |
| 1 | A | HR | M | 7 |
期望输出表
| ID | COMPANY | DEPT | FLAG | INDICATOR | C1 |
|---|---|---|---|---|---|
| 1 | A | HR | F | 2 | 2 |
| 1 | A | HR | P | 3 | 2 |
| 1 | A | HR | M | 4 | 2 |
| 1 | A | HR | F | 5 | 5 |
| 1 | A | HR | P | 6 | 5 |
| 1 | A | HR | M | 7 | 5 |
解决方案代码
WITH grouped_data AS ( SELECT ID, COMPANY, DEPT, FLAG, INDICATOR, -- 累计分组内F的出现次数,生成子分组标识 SUM(CASE WHEN FLAG = 'F' THEN 1 ELSE 0 END) OVER ( PARTITION BY ID, COMPANY, DEPT ORDER BY INDICATOR -- 需根据实际数据的排序逻辑调整,确保行顺序正确 ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW ) AS f_subgroup FROM your_table -- 替换为你的实际表名 ) SELECT ID, COMPANY, DEPT, FLAG, INDICATOR, -- 在每个子分组中提取F对应的INDICATOR值,填充到所有行 MAX(CASE WHEN FLAG = 'F' THEN INDICATOR END) OVER ( PARTITION BY ID, COMPANY, DEPT, f_subgroup ) AS C1 FROM grouped_data ORDER BY ID, COMPANY, DEPT, INDICATOR;
代码说明
- 生成子分组:通过
SUM窗口函数累计每个分组内到当前行为止FLAG=F的出现次数,将每个F到下一个F之前的行划分为同一个子分组(f_subgroup)。 - 填充C1列:在每个子分组内,用
MAX函数提取FLAG=F对应的INDICATOR值,由于每个子分组仅存在一行FLAG=F,该值会被填充到子分组内的所有行。
内容的提问来源于stack exchange,提问作者Johnson
相关产品推荐
相关产品推荐

