如何通过SQL窗口函数实现按组条件统一赋值?
问题描述
现有数据表结构及数据如下:
| Name | class | score |
|---|---|---|
| Allen | A | 0 |
| Sarah | A | 1 |
| Derek | A | 0 |
| Josh | B | 1 |
| Pini | B | 0 |
| Karen | C | 0 |
| Louis | C | 0 |
需求:按class分组,若组内score总和≥1,则为该组所有记录新增的pass字段赋值1;否则赋值0。期望结果如下:
| Name | class | score | pass |
|---|---|---|---|
| Allen | A | 0 | 1 |
| Sarah | A | 1 | 1 |
| Derek | A | 0 | 1 |
| Josh | B | 1 | 1 |
| Pini | B | 0 | 1 |
| Karen | C | 0 | 0 |
| Louis | C | 0 | 0 |
希望用窗口函数实现,求具体方法。
解决方案
用窗口函数可以直接实现这个需求,核心是先计算每个班级的总分,再根据总分判断pass字段的值。具体SQL语句如下:
SELECT Name, class, score, CASE WHEN SUM(score) OVER (PARTITION BY class) >= 1 THEN 1 ELSE 0 END AS pass FROM your_table; -- 替换为你的实际表名
关键逻辑说明:
SUM(score) OVER (PARTITION BY class):这是窗口函数的核心部分,PARTITION BY class指定按班级分组,SUM(score)计算每个分组的总分,这个总分会对应到该班级的每一条记录上。CASE表达式:基于分组后的总分进行判断,给每条记录的pass字段赋值1或0。
执行这条SQL就能直接得到目标结果,不需要额外的表关联或子查询,效率较高。
内容的提问来源于stack exchange,提问作者Aaron Lee
相关产品推荐
相关产品推荐

