Mysql SQL如何在分组行中获取表中列的最大值的行
我有一个表,表中有列('name','maj','min','patch'),每个名称可以有几个主要/次要/补丁版本。对于每个名称,我需要获得该主/辅最大“补丁”的主+辅值 e、 g.表“数据”Mysql SQL如何在分组行中获取表中列的最大值的行,mysql,sql,Mysql,Sql,我有一个表,表中有列('name','maj','min','patch'),每个名称可以有几个主要/次要/补丁版本。对于每个名称,我需要获得该主/辅最大“补丁”的主+辅值 e、 g.表“数据” |id|name|maj|min|patch| |1 |n1 |1 |0 | 1 | |2 |n1 |1 |0 | 2 | |3 |n1 |1 |0 | 3 | |4 |n2 |1 |0 | 1 | |5 |n2 |2 |0 | 1 | |6 |n2
|id|name|maj|min|patch|
|1 |n1 |1 |0 | 1 |
|2 |n1 |1 |0 | 2 |
|3 |n1 |1 |0 | 3 |
|4 |n2 |1 |0 | 1 |
|5 |n2 |2 |0 | 1 |
|6 |n2 |2 |0 | 2 |
预期产出:
|id|name|maj|min|patch|
|3 |n1 |1 |0 | 3 |
|4 |n2 |1 |0 | 1 |
|6 |n2 |2 |0 | 2 |
我只按这些字段对这些数据进行了分组并进行了排序,但我不知道如何只获取每个主/次字段的最大补丁行
SELECT id, name, maj, min, patch FROM data group by name, maj, min order by name, patch desc
以下查询接近您想要的内容:
SELECT
name,
maj,
`min`,
MAX(patch) AS patch
FROM data
GROUP BY
name,
maj,
`min`;
但是,这不包括id
列,该列不是聚合查询的一部分。如果你想要一个通用的方法来包括整个匹配行,那么考虑使用<代码> Roox编号< /C> >:
WITH cte AS (
SELECT *, ROW_NUMBER() OVER (PARTITION BY name, maj, `min` ORDER BY patch DESC) rn
FROM data
)
SELECT id, name, maj, `min`, patch
FROM cte
WHERE rn = 1;
您可以简单地使用having子句来实现它 简单样本
SELECT id, name, maj, min, max(patch) AS max_patch FROM data GROUP BY patch DESC HAVING MAX(patch) >1;
希望这对你有帮助
不存在以下情况:
select t.* from tablename t
where not exists (
select 1 from tablename
where name = t.name and maj = t.maj and min = t.min and patch > t.patch
)
请参阅。结果:
也可以使用相关子查询执行此操作:
selet t.*
from t
where t.patch = (select max(t2.patch)
from t t2
where t2.name = t.name and
t2.maj = t.maj and
t2.min = t.min
);
如果您有一个大型数据库,那么
(name,maj,min,patch)
上的索引将提供良好的性能。查看函数MAX(),它应该可以帮助您解决此问题。简单地说,这是你做不到的。这对我来说是最容易理解的。非常感谢。谢谢分享db小提琴!超级有用
selet t.*
from t
where t.patch = (select max(t2.patch)
from t t2
where t2.name = t.name and
t2.maj = t.maj and
t2.min = t.min
);