导读:本期聚焦于小伙伴创作的《SQL如何按任务进度进行分组统计并自定义聚合逻辑》,敬请观看详情,探索知识的价值。以下视频、文章将为您系统阐述其核心内容与价值。如果您觉得《SQL如何按任务进度进行分组统计并自定义聚合逻辑》有用,将其分享出去将是对创作者最好的鼓励。

在实际的业务数据处理场景中,经常需要按照任务进度维度对数据做分组统计,同时还需要实现个性化的聚合逻辑来满足业务需求,比如统计不同进度下的任务数量、平均完成耗时等。不同的SQL数据库提供了不同的能力支持这类操作,下面会逐步讲解实现方法。

SQL如何按任务进度进行分组统计并自定义聚合逻辑

基础分组统计实现

首先我们需要明确任务进度的划分规则,通常任务进度会以百分比或者状态值的形式存储,比如0代表未开始,30代表进行中,70代表待验收,100代表已完成。如果只需要做简单的分组统计,比如统计每个进度区间的任务数量,可以直接使用GROUP BY语句实现。

假设我们有如下任务表task_info,表结构如下:

字段名类型说明
task_idINT任务ID
task_nameVARCHAR任务名称
progressINT任务进度(0-100)
cost_timeINT任务耗时(小时)

如果我们要按照进度区间分组,统计每个区间的任务数量,可以使用CASE WHEN语句先对进度做区间划分,再进行分组:

-- 按进度区间分组统计任务数量
SELECT 
  CASE 
    WHEN progress = 0 THEN '未开始'
    WHEN progress > 0 AND progress < 100 THEN '进行中'
    WHEN progress = 100 THEN '已完成'
    ELSE '异常进度'
  END AS progress_stage,
  COUNT(*) AS task_count
FROM task_info
GROUP BY 
  CASE 
    WHEN progress = 0 THEN '未开始'
    WHEN progress > 0 AND progress < 100 THEN '进行中'
    WHEN progress = 100 THEN '已完成'
    ELSE '异常进度'
  END
ORDER BY task_count DESC;

自定义聚合逻辑的实现

如果基础的聚合函数(比如COUNTSUMAVG)无法满足需求,就需要实现自定义聚合逻辑。不同数据库的实现方式有所区别,下面分别介绍MySQL和PostgreSQL的实现方法。

MySQL中自定义聚合函数

MySQL支持通过创建存储函数来模拟自定义聚合逻辑,比如我们需要统计每个进度区间下,耗时超过24小时的任务占比,就需要自定义计算逻辑。

首先创建一个存储函数,用来判断单个任务的耗时是否超过24小时:

-- 创建判断耗时是否超24小时的存储函数
DELIMITER //
CREATE FUNCTION is_over_24(cost INT)
RETURNS INT
DETERMINISTIC
BEGIN
  DECLARE result INT;
  IF cost > 24 THEN
    SET result = 1;
  ELSE
    SET result = 0;
  END IF;
  RETURN result;
END //
DELIMITER ;

然后结合分组语句,统计每个进度区间的超24小时任务数量和总任务数,再计算占比:

-- 统计各进度区间超24小时任务占比
SELECT 
  CASE 
    WHEN progress = 0 THEN '未开始'
    WHEN progress > 0 AND progress < 100 THEN '进行中'
    WHEN progress = 100 THEN '已完成'
    ELSE '异常进度'
  END AS progress_stage,
  COUNT(*) AS total_task,
  SUM(is_over_24(cost_time)) AS over_24_task,
  CONCAT(ROUND(SUM(is_over_24(cost_time)) / COUNT(*) * 100, 2), '%') AS over_24_rate
FROM task_info
GROUP BY 
  CASE 
    WHEN progress = 0 THEN '未开始'
    WHEN progress > 0 AND progress < 100 THEN '进行中'
    WHEN progress = 100 THEN '已完成'
    ELSE '异常进度'
  END;

PostgreSQL中自定义聚合

PostgreSQL支持更灵活的自定义聚合函数,我们可以直接创建一个聚合函数来完成复杂统计。比如我们需要统计每个进度区间下,所有任务耗时的中位数,就需要自定义聚合逻辑。

首先创建一个计算中位数的聚合函数:

-- 创建中位数聚合函数
CREATE OR REPLACE FUNCTION median_agg_transition(state ANYARRAY, val ANYELEMENT)
RETURNS ANYARRAY AS $$
BEGIN
  RETURN array_append(state, val);
END;
$$ LANGUAGE plpgsql;

CREATE OR REPLACE FUNCTION median_agg_final(state ANYARRAY)
RETURNS NUMERIC AS $$
DECLARE
  sorted_arr ANYARRAY;
  arr_len INT;
  mid_idx INT;
BEGIN
  SELECT ARRAY(SELECT unnest(state) ORDER BY 1) INTO sorted_arr;
  arr_len := array_length(sorted_arr, 1);
  IF arr_len % 2 = 1 THEN
    RETURN sorted_arr[(arr_len + 1) / 2];
  ELSE
    RETURN (sorted_arr[arr_len / 2] + sorted_arr[arr_len / 2 + 1]) / 2.0;
  END IF;
END;
$$ LANGUAGE plpgsql;

CREATE AGGREGATE median(ANYELEMENT) (
  SFUNC = median_agg_transition,
  STYPE = ANYARRAY,
  FINALFUNC = median_agg_final,
  INITCOND = '{}'
);

然后使用这个自定义聚合函数统计各进度区间的任务耗时中位数:

-- 按进度区间分组统计任务耗时中位数
SELECT 
  CASE 
    WHEN progress = 0 THEN '未开始'
    WHEN progress > 0 AND progress < 100 THEN '进行中'
    WHEN progress = 100 THEN '已完成'
    ELSE '异常进度'
  END AS progress_stage,
  COUNT(*) AS task_count,
  median(cost_time) AS median_cost_time
FROM task_info
GROUP BY 
  CASE 
    WHEN progress = 0 THEN '未开始'
    WHEN progress > 0 AND progress < 100 THEN '进行中'
    WHEN progress = 100 THEN '已完成'
    ELSE '异常进度'
  END;

注意事项

  • 进度区间的划分规则需要和实际业务对齐,避免出现进度值遗漏的情况。
  • 自定义聚合函数如果涉及复杂逻辑,需要注意性能问题,数据量较大时可以先做数据过滤再分组统计。
  • 不同数据库的自定义函数语法差异较大,编写时需要参考对应数据库的官方文档。
  • 如果进度是连续值,也可以使用FLOOR(progress/10)*10这样的方式做10%区间的自动划分,减少CASE WHEN的书写量。
自定义聚合逻辑的核心是先把分组维度确定好,再把需要聚合的字段按照业务规则做处理,最后结合分组语句输出结果,只要理清这个流程,大部分任务进度的分组统计需求都可以实现。

SQL任务进度分组自定义聚合分组统计数据聚合修改时间:2026-06-20 21:57:38

免责声明:​ 已尽一切努力确保本网站所含信息的准确性。网站内容多为原创整理与精心编撰,观点力求客观中立。本站旨在免费分享,内容仅供个人学习、研究或参考使用。若引用了第三方作品,版权归原作者所有。如内容涉及您的权益,请联系我们处理。
内容垂直聚焦
专注技术核心技术栏目,确保每篇文章深度聚焦于实用技能。从代码技巧到架构设计,为用户提供无干扰的纯技术知识沉淀,精准满足专业提升需求。
知识结构清晰
覆盖从开发到部署的全链路。AI、前端、编程、数据库、服务器、建站、系统层层递进,构建清晰学习路径,帮助用户系统化掌握开发与运维所需的核心技术。
深度技术解析
拒绝泛泛而谈,深入技术细节与实践难点。无论是数据库优化还是服务器配置,均结合真实场景与代码示例进行剖析,致力于提供可直接应用于工作的解决方案。
专业领域覆盖
精准对应开发生命周期。从前端界面到后端编程,从数据库操作到服务器运维,形成完整闭环,一站式满足全栈工程师和运维人员的技术需求。
即学即用高效
内容强调实操性,步骤清晰、代码完整。用户可根据教程直接复现和应用于自身项目,显著缩短从学习到实践的距离,快速解决开发中的具体问题。
持续更新保障
专注既定技术方向进行长期、稳定的内容输出。确保各栏目技术文章持续更新迭代,紧跟主流技术发展趋势,为用户提供经久不衰的学习价值。