SQL如何查询每个客户ID对应值为真的最大编号指标字段
问题说明
现有一张客户指标表,共6个字段:客户ID(cid)、5个二值指标字段f1到f5,样例数据如下:
cid, f1, f2, f3, f4, f5 101, 1, 1, 1 , 0 , 0 102, 1, 1, 0 , 0 , 0 103, 1, 0, 0 , 0 , 0
查询需求
针对每个客户ID,查询获取指标值为1(真值)的编号最大的f字段。
预期输出结果
for 101 -> f3; for 102 -> f2; for 103 -> f1;
测试表复现代码
执行以下SQL即可创建测试表并插入样例数据:
CREATE TABLE customer_status ( cid int, f1 int, f2 int, f3 int, f4 int, f5 int); insert into customer_status values(101, 1, 1, 1 , 0 , 0); insert into customer_status values(102, 1, 1, 0 , 0 , 0); insert into customer_status values(103, 1, 0, 0 , 0 , 0);
查询实现方案
用CASE表达式从编号最大的f字段倒序判断,第一个命中值为1的字段就是目标字段,逻辑简单且执行效率最高:
SELECT CONCAT('for ', cid, ' -> ', CASE WHEN f5 = 1 THEN 'f5' WHEN f4 = 1 THEN 'f4' WHEN f3 = 1 THEN 'f3' WHEN f2 = 1 THEN 'f2' WHEN f1 = 1 THEN 'f1' ELSE NULL END, ';' ) AS res FROM customer_status;
执行上述SQL得到的结果和预期完全匹配:
| cid | res |
|---|---|
| 101 | for 101 -> f3; |
| 102 | for 102 -> f2; |
| 103 | for 103 -> f1; |
如果不需要拼接输出格式,仅需要返回对应字段名,直接取CASE语句的计算结果作为字段值即可。
内容的提问来源于stack exchange,提问作者Vineet
相关产品推荐
相关产品推荐

