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

求助:MariaDB实现行转列并筛选每个跑者各项目最快时长

MariaDB行转列实现跑者最快时长统计

静态项目场景(已知所有项目名称)

MariaDB没有原生PIVOT函数,直接用条件聚合就能实现需求。假设你的runningtimes表结构包含runner_name(跑者姓名)、event(跑步项目)、run_time(跑步时长,建议用数值类型如INT存秒数,或TIME类型),执行以下SQL:

SELECT
  runner_name,
  MIN(CASE WHEN event = '5K' THEN run_time END) AS '5K最快时长',
  MIN(CASE WHEN event = '10K' THEN run_time END) AS '10K最快时长',
  MIN(CASE WHEN event = '半程马拉松' THEN run_time END) AS '半程马拉松最快时长',
  MIN(CASE WHEN event = '全程马拉松' THEN run_time END) AS '全程马拉松最快时长'
FROM runningtimes
GROUP BY runner_name;
  • 核心逻辑:用CASE语句按项目筛选对应时长,再用MIN()聚合取每个跑者的最快时长(如果时长是TIME类型,MIN()也能正确取最短时间);GROUP BY runner_name保证每个跑者一行数据。

动态项目场景(项目不固定或会新增)

如果项目数量不确定,可通过动态SQL自动生成列:

SET @sql = NULL;

SELECT GROUP_CONCAT(DISTINCT
  CONCAT(
    'MIN(CASE WHEN event = ''', event, ''' THEN run_time END) AS ''', event, '最快时长'''
  )
) INTO @sql
FROM runningtimes;

SET @sql = CONCAT('SELECT runner_name, ', @sql, ' FROM runningtimes GROUP BY runner_name');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
  • 逻辑说明:先用GROUP_CONCAT拼接所有项目对应的CASE语句,再组装成完整SQL执行,自动适配所有存在的项目。

常见问题排查

  1. 若执行报错,先检查run_time字段类型:如果是字符串格式(如'00:30:00'),需先转成TIME类型再聚合,比如MIN(STR_TO_DATE(run_time, '%H:%i:%s'))。
  2. 若结果出现NULL,表示该跑者未参与对应项目,可加COALESCE替换为默认值,比如COALESCE(MIN(...), '未参与')。

内容的提问来源于stack exchange,提问作者OpperSnokker

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 15:06:06