You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.27 06:42:42