请求生成SQL查询:按PId/PDId/Emp分组,含FALSE则聚合为FALSE
需求与SQL解决方案
原始表结构
| FFId | PId | PDId | Emp | Operating |
|---|---|---|---|---|
| 885 | 3022 | 816 | 1090A | true |
| 871 | 3022 | 816 | 1090A | false |
| 839 | 7465 | 7196 | 989A | true |
| 839 | 7465 | 7196 | 1094A | true |
| 782 | 3994 | 4290 | 1176A | true |
| 796 | 3994 | 4290 | 1176A | false |
需求说明
按PId、PDId、Emp字段分组:
- 若分组内
Operating字段存在false值,则该分组所有记录的New Operating字段为false - 若分组内
Operating字段全为true,则New Operating字段为true
期望结果
| FFId | PId | PDId | Emp | Operating | New Operating |
|---|---|---|---|---|---|
| 885 | 3022 | 816 | 1090A | true | false |
| 871 | 3022 | 816 | 1090A | false | false |
| 839 | 7465 | 7196 | 989A | true | true |
| 839 | 7465 | 7196 | 1094A | true | true |
| 782 | 3994 | 4290 | 1176A | true | false |
| 796 | 3994 | 4290 | 1176A | false | false |
SQL查询语句
方案1:窗口函数实现(推荐,支持MySQL 8+、PostgreSQL、SQL Server等)
SELECT FFId, PId, PDId, Emp, Operating, MIN(Operating) OVER (PARTITION BY PId, PDId, Emp) AS `New Operating` FROM your_table_name;
逻辑说明:布尔值在聚合计算中会被转换为1(true)和0(false),MIN()函数会提取分组内的最小值。只要分组里存在false(0),结果就是false;全为true时结果为true,完全匹配需求。
方案2:子查询关联实现(兼容低版本数据库)
SELECT t1.FFId, t1.PId, t1.PDId, t1.Emp, t1.Operating, CASE WHEN t2.has_false = 1 THEN false ELSE true END AS `New Operating` FROM your_table_name t1 JOIN ( SELECT PId, PDId, Emp, MAX(CASE WHEN Operating = false THEN 1 ELSE 0 END) AS has_false FROM your_table_name GROUP BY PId, PDId, Emp ) t2 ON t1.PId = t2.PId AND t1.PDId = t2.PDId AND t1.Emp = t2.Emp;
逻辑说明:子查询先按分组字段统计是否存在false值,再关联回原表,通过CASE语句生成目标字段。
注意:请将语句中的
your_table_name替换为实际表名。
内容的提问来源于stack exchange,提问作者Crazy
相关产品推荐
相关产品推荐

