Oracle SQL需求:按Item_no、Item_type、Region分组统一Valid列取值
解决方案
你可以使用Oracle的窗口函数来实现需求,无需对values列做分组聚合,既能保留原结果集的所有行,又能按指定分组逻辑统一valid列的值。
实现思路
用MAX()窗口函数按Item_no、item_type、region分区:
- 字符串
'Yes'的排序优先级高于'No',组内只要存在valid = 'Yes',MAX(valid)就会返回'Yes' - 若组内全是
'No',则MAX(valid)返回'No'
完整SQL示例
假设你的原始查询为SELECT Item_no, item_type, region, valid, values FROM your_table,修改后的查询如下:
SELECT Item_no, item_type, region, MAX(valid) OVER (PARTITION BY Item_no, item_type, region) AS valid, values FROM your_table;
执行结果
运行上述SQL后,会得到你预期的输出:
| Item_no | item_type | region | valid | values |
|---|---|---|---|---|
| 10001 | ATC | US | Yes | CY412 |
| 10001 | ATC | US | Yes | DSS1 |
| 10001 | ATC | RU | No | RX111 |
| 10001 | ATC | RU | No | DS12 |
通用适配说明
如果valid列不是字符串类型(比如布尔值),可以用更通用的逻辑实现:
SELECT Item_no, item_type, region, CASE WHEN MAX(CASE WHEN valid = 'Yes' THEN 1 ELSE 0 END) OVER (PARTITION BY Item_no, item_type, region) = 1 THEN 'Yes' ELSE 'No' END AS valid, values FROM your_table;
内容的提问来源于stack exchange,提问作者Narasimhan M
相关产品推荐
相关产品推荐

