SQL多活动状态判断最优方案咨询:按规则返回指定状态
多活动状态聚合的SQL实现方案
最优方案:CASE结合聚合判断
这是最直观且性能稳定的实现方式,完全匹配给定的优先级规则:
-- 假设表中存在用户标识列UserID,用于按用户聚合多项活动 SELECT UserID, CASE -- 优先级1:存在至少1项Done状态 WHEN COUNT(CASE WHEN StatusColumn = 'Done' THEN 1 END) > 0 THEN 'Done' -- 优先级2:无Done但存在至少1项In Progress状态 WHEN COUNT(CASE WHEN StatusColumn = 'In Progress' THEN 1 END) > 0 THEN 'In Progress' -- 优先级3:所有活动都是Hold状态 ELSE 'Hold' END AS OverallStatus FROM MyTable GROUP BY UserID;
逻辑说明
- 内层
CASE仅在状态匹配时返回1,否则返回NULL,COUNT会忽略NULL值,从而统计对应状态的活动数量 - 按优先级顺序判断,一旦满足条件就返回对应状态,无需继续后续判断
如果不需要按用户聚合,而是要整个表的整体状态,只需去掉UserID和GROUP BY子句即可。
其他可行方法
方法1:基于优先级数值的MAX函数映射
给不同状态赋予优先级数值,通过取最大值来确定最终状态:
SELECT UserID, CASE MAX( CASE StatusColumn WHEN 'Done' THEN 3 WHEN 'In Progress' THEN 2 WHEN 'Hold' THEN 1 END ) WHEN 3 THEN 'Done' WHEN 2 THEN 'In Progress' WHEN 1 THEN 'Hold' END AS OverallStatus FROM MyTable GROUP BY UserID;
方法2:EXISTS子查询判断
通过子查询检查用户是否存在对应状态,找到匹配项后立即终止判断,适合数据量较大的场景:
SELECT DISTINCT UserID, CASE WHEN EXISTS (SELECT 1 FROM MyTable t2 WHERE t2.UserID = t1.UserID AND t2.StatusColumn = 'Done') THEN 'Done' WHEN EXISTS (SELECT 1 FROM MyTable t2 WHERE t2.UserID = t1.UserID AND t2.StatusColumn = 'In Progress') THEN 'In Progress' ELSE 'Hold' END AS OverallStatus FROM MyTable t1;
内容的提问来源于stack exchange,提问作者user21066109
相关产品推荐
相关产品推荐

