首页 > 解决方案 > 在mysql中分组,其他列的值较低

问题描述

如果 tval 具有重复/重复值,则需要按组的id和组的group最大值和最小值进行分组。tval感谢你的帮助。

ID 时间 团体 tval
3 0 一种 1.184
3 0.5 一种 2.173
3 1 一种 1.065
3 3 一种 1.143
3 6 一种 3.222
3 9 一种 1.851
3 12 一种 3.222
4 0 一种 1.184
4 0.5 一种 2.173
4 1 一种 1.065
4 3 一种 1.143
4 0.7 一种 2.322
4 9 一种 1.851
4 12 一种 1.345

预期产出

ID 团体 时间 tval
3 一种 6 3.222
4 一种 0.7 2.322

下面是创建和插入查询,供有兴趣尝试的人使用。

CREATE TABLE sample (id INT, timel DOUBLE, group VARCHAR(50), tval DOUBLE);

INSERT INTO sample VALUES
(3,0,'a',1.184),
(3,0.5,'a',2.173),
(3,1,'a',1.065),
(3,3,'a',1.143),
(3,6,'a',3.222),
(3,9,'a',1.851),
(3,12,'a',3.222),
(4,0,'a',1.184),
(4,0.5,'a',2.173),
(4,1,'a',1.065),
(4,3,'a',1.143),
(4,0.7,'a',2.322),
(4,9,'a',1.851),
(4,12,'a',1.345);

标签: mysql

解决方案


用于NOT EXISTS过滤表,以便您仅tval获取每个组合的最大行idgroup然后聚合以获取最小值timel

SELECT s1.id, s1.trt, MIN(timel) timel, s1.tval 
FROM sample s1
WHERE NOT EXISTS (
  SELECT 1
  FROM sample s2
  WHERE  s2.id = s1.id AND s2.trt = s1.trt AND s2.tval > s1.tval
)
GROUP BY s1.id, s1.trt, s1.tval

如果您的 MySql 版本是 8.0+,您可以使用ROW_NUMBER()窗口函数:

SELECT id, trt, timel, tval 
FROM (
  SELECT *, ROW_NUMBER() OVER (PARTITION BY id, trt ORDER BY tval DESC, timel) rn
  FROM sample
) t
WHERE rn = 1

请参阅演示


推荐阅读