通过子查询/CTE识别区域组合,为数据表添加pure/mix类型列
实现方案:新增type列(基于子查询/CTE)
方法一:子查询实现
先通过子查询判断每个id下是否存在area不属于A、C、D的记录,再将判断结果关联回原表生成type列:
SELECT t.*, CASE WHEN exists_flag = 1 THEN 'mix' ELSE 'pure' END AS type FROM your_table t JOIN (SELECT id, MAX(CASE WHEN area NOT IN ('A', 'C', 'D') THEN 1 ELSE 0 END) AS exists_flag FROM your_table GROUP BY id) id_flag ON t.id = id_flag.id;
逻辑说明
- 子查询里用
MAX(CASE...)统计每个id的标记:只要有一行area不在A/C/D范围内,exists_flag就会被设为1,否则为0。 - 关联原表后,根据
exists_flag的值输出对应的type:1对应'mix',0对应'pure'。
方法二:CTE(公共表表达式)实现
用CTE先计算每个id的类型标记,再和原表关联,写法更直观:
WITH id_type AS ( SELECT id, CASE WHEN COUNT(CASE WHEN area NOT IN ('A', 'C', 'D') THEN 1 END) > 0 THEN 'mix' ELSE 'pure' END AS type FROM your_table GROUP BY id ) SELECT t.*, it.type FROM your_table t JOIN id_type it ON t.id = it.id;
逻辑说明
- CTE
id_type中,用COUNT(CASE...)统计每个id下不符合条件的area行数:如果行数大于0,说明存在非A/C/D的记录,标记为'mix',否则为'pure'。 - 将原表与CTE关联,直接把对应
type字段带入结果集。
内容的提问来源于stack exchange,提问作者David
相关产品推荐
相关产品推荐

