SQL查询需求:依据range字段规则生成items分类结果
解决这个SQL分类问题的思路和查询语句
首先我得从你给出的输入和输出反推分类规则,先明确每个result对应的range特征:
- conv:该item的
range值仅包含38和/或451(没有其他任何数值) - ms:该item的
range里存在110、111、112、115这类数值,且不包含1或2;同时不属于conv的范畴 - common:不属于上面两类的情况(也就是包含1或2,同时还有其他数值)
基于这个规则,我们可以用聚合函数统计每个item的range满足的条件,再用CASE语句生成对应的result。
最终SQL查询语句
SELECT items, CASE -- 判断是否为conv:range只有38或451 WHEN COUNT(DISTINCT CASE WHEN range NOT IN (38, 451) THEN range END) = 0 THEN 'conv' -- 判断是否为ms:存在110/111/112/115,且没有1或2 WHEN COUNT(DISTINCT CASE WHEN range IN (110, 111, 112, 115) THEN range END) > 0 AND COUNT(DISTINCT CASE WHEN range IN (1, 2) THEN range END) = 0 THEN 'ms' -- 剩下的都是common ELSE 'common' END AS result FROM your_table_name GROUP BY items ORDER BY items;
代码解释
- 判断conv:用
COUNT(DISTINCT CASE...)统计不在(38,451)里的range值数量,如果为0,说明所有range都是38或451,标记为conv。 - 判断ms:首先统计存在110/111/112/115的数量大于0(说明有这类数值),同时统计1或2的数量为0(说明没有小数值),满足这两个条件就标记为
ms。 - common:剩下的所有情况都归为
common,比如包含1/2同时还有其他数值的item1、item3。
你只需要把your_table_name替换成你实际的表名即可运行,这个查询会按item分组,输出你期望的结果。
内容的提问来源于stack exchange,提问作者tech_guy
相关产品推荐
相关产品推荐

