Mysql SQL如何在分组行中获取表中列的最大值的行

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

我有一个表,表中有列('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  |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
                );