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

时间:2019-08-07 12:48:03

标签: mysql sql

我有一个表,其中每个名称都有列(“名称”,“ maj”,“最小”,“补丁”),可以有几个主要/次要/补丁版本。对于每个名称,我都需要获取该主要/次要对象的最大“补丁”的主要和次要值。

例如表“数据”

|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

4 个答案:

答案 0 :(得分:1)

以下查询接近您想要的内容:

SELECT
    name,
    maj,
    `min`,
    MAX(patch) AS patch
FROM data
GROUP BY
    name,
    maj,
    `min`;

但是,这不包括id列,它不是聚合查询的一部分。如果您希望采用一种通用方法来包括整个匹配行,请考虑使用ROW_NUMBER

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;

答案 1 :(得分: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
)  

请参见demo
结果:

| id  | name | maj | min | patch |
| --- | ---- | --- | --- | ----- |
| 3   | n1   | 1   | 0   | 3     |
| 4   | n2   | 1   | 0   | 1     |
| 6   | n2   | 2   | 0   | 2     |

答案 2 :(得分:1)

您也可以使用相关子查询来做到这一点:

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)上的索引将提供良好的性能。

答案 3 :(得分:-1)

您可以简单地使用Clause来实现它 简单样本

SELECT id, name, maj, min, max(patch) AS max_patch FROM data GROUP BY patch DESC HAVING MAX(patch) >1;
  

希望对您有帮助