我有一个表,其中每个名称都有列(“名称”,“ 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
答案 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;
希望对您有帮助