MySQL数据处理需求:按ID筛选最小值并新增Range等字段
解决方案
没问题,我帮你整理出满足需求的SQL查询,顺便拆解下每个部分的作用:
完整SQL查询
假设你的原始数据表名为your_table,可以用下面的语句实现需求:
WITH id_stats AS ( SELECT ID, MIN(T1) AS min_T1, MIN(T2) AS min_T2, LEAST(MIN(T1), MIN(T2)) AS Minimum, COUNT(*) AS Count, -- 根据Minimum值划分指定区间 CASE WHEN LEAST(MIN(T1), MIN(T2)) BETWEEN -5 AND 5 THEN '-5到5' WHEN LEAST(MIN(T1), MIN(T2)) BETWEEN 5 AND 10 THEN '5到10' WHEN LEAST(MIN(T1), MIN(T2)) BETWEEN 10 AND 15 THEN '10到15' WHEN LEAST(MIN(T1), MIN(T2)) > 15 THEN '15以上' ELSE '-5以下' END AS Range FROM your_table GROUP BY ID ) SELECT t.ID, t.Date, t.T1, t.T2, s.Range, s.Minimum, s.Count FROM your_table t JOIN id_stats s ON t.ID = s.ID WHERE t.T1 = s.min_T1 AND t.T2 = s.min_T2 ORDER BY t.ID;
查询逻辑拆解
CTE
id_stats统计部分
先按ID分组计算每个ID的核心指标:min_T1/min_T2:分别提取该ID下T1、T2字段的最小值Minimum:用LEAST函数取该ID所有T1和T2值中的最小数Count:统计每个ID对应的总行数Range:通过CASE语句判断Minimum所属的区间,覆盖了你要求的范围,同时补充了边界情况(-5以下、15以上)
主查询筛选部分
将原表和统计结果关联,筛选出每个ID中同时包含T1最小值和T2最小值的行(从你的样本数据看,每个ID都存在这样的行),确保每个ID只返回唯一一行,最终输出包含原始字段和新增的三个字段。
执行结果预览
| ID | Date | T1 | T2 | Range | Minimum | Count |
|---|---|---|---|---|---|---|
| A-12 | 2017-01-01 15:05:20 | -3 | 3 | -5到5 | -3 | 2 |
| A-14 | 2017-01-01 15:05:20 | 6 | -2 | -5到5 | -2 | 2 |
| A-15 | 2017-01-01 15:05:20 | 10 | 9 | 5到10 | 9 | 2 |
| A-17 | 2017-01-01 15:05:20 | 19 | 18 | 15以上 | 18 | 1 |
如果你的数据中存在某个ID的T1最小值和T2最小值不在同一行的情况,可以随时告诉我,我再调整查询逻辑~
内容的提问来源于stack exchange,提问作者Roy1245
相关产品推荐
相关产品推荐

