如何筛选仅满足tinyint=1条件的Table.Number对应数据行?
筛选全组tinyint均为1的数据行
没问题,我完全get到你的需求了:要找出所有属于「该分组下所有行的tinyint字段都等于1」的Table.Number分组,然后把这些分组里的所有数据行都筛选出来——就像你举的例子,只要1112和1114分组里每一行的tinyint都是1,就把这两个组的所有行都保留下来。
下面给你两种适配大多数关系型数据库(比如MySQL、PostgreSQL、SQL Server等)的常用实现方案:
方法一:分组聚合+关联查询
这种方法先通过子查询锁定所有符合条件的分组(Table.Number),再关联原表取出对应行:
SELECT t.* FROM your_table t INNER JOIN ( -- 筛选出所有分组内tinyint全为1的Number SELECT Number FROM your_table GROUP BY Number -- 聚合判断:分组内最大和最小tinyint都是1,说明组内没有其他值 HAVING MAX(tinyint) = 1 AND MIN(tinyint) = 1 -- 如果tinyint字段可能存在NULL值,需要额外加这一行确保分组内没有空值 -- AND COUNT(tinyint) = COUNT(*) ) AS valid_groups ON t.Number = valid_groups.Number;
方法二:窗口函数标记筛选
用窗口函数给每一行标记所在分组的tinyint极值,再直接筛选符合条件的行:
SELECT * FROM ( SELECT *, -- 计算当前Number分组的tinyint最大值和最小值 MAX(tinyint) OVER (PARTITION BY Number) AS max_tinyint, MIN(tinyint) OVER (PARTITION BY Number) AS min_tinyint FROM your_table ) AS sub_query -- 只保留分组内全为1的行 WHERE max_tinyint = 1 AND min_tinyint = 1;
额外小技巧
如果你的tinyint字段只有0和1两种取值,还可以用更直观的逻辑判断分组内没有不符合条件的行:
把方法一子查询里的HAVING子句换成:
HAVING SUM(CASE WHEN tinyint != 1 THEN 1 ELSE 0 END) = 0
这个逻辑是统计分组内tinyint不等于1的行数,等于0就说明整个分组全是1。
内容的提问来源于stack exchange,提问作者user8511293
相关产品推荐
相关产品推荐

