![](/img/trans.png)
[英]How to select rows from MySQL based on max value of a one column and grouping two other columns?
[英]Select rows with Max(Column Value) for each unique combination of two other columns
我正在使用如下示例表。 一个数据集有多个组,每次写入表时,数据集的 RunNumber 以及每个组的数据和总数都会增加。 每个数据集/组组合通常会有多行,示例如下:
运行编号 | 团体 | 数据集 | 全部的 |
---|---|---|---|
1 | 第 1 组 | 数据集 A | 10 |
1 | 第 1 组 | 数据集 A | 20 |
2 | 第 1 组 | 数据集 A | 30 |
2 | 第 2 组 | 数据集 A | 15 |
1 | 第 1 组 | 数据集 B | 5 |
1 | 第 2 组 | 数据集 B | 10 |
1 | 第 3 组 | 数据集 A | 30 |
2 | 第 3 组 | 数据集 A | 30 |
1 | 第 1 组 | 数据集 C | 15 |
1 | 第 2 组 | 数据集 C | 50 |
2 | 第 2 组 | 数据集 C | 70 |
2 | 第 2 组 | 数据集 C | 90 |
我想要做的对于数据集和组的每个组合都是必不可少的,返回具有给定数据集/组组合的 max(RunNumber) 的行的所有数据。 例如,上面的示例将返回:
运行编号 | 团体 | 数据集 | 全部的 |
---|---|---|---|
2 | 第 1 组 | 数据集 A | 30 |
2 | 第 2 组 | 数据集 A | 15 |
1 | 第 1 组 | 数据集 B | 5 |
1 | 第 2 组 | 数据集 B | 10 |
2 | 第 3 组 | 数据集 A | 30 |
1 | 第 1 组 | 数据集 C | 15 |
2 | 第 2 组 | 数据集 C | 70 |
2 | 第 2 组 | 数据集 C | 90 |
在数据集/组匹配的地方,所有行都保留给定组合的最大 RunNumber。 目前,我已将其拆分为 2 个单独的查询,其中我首先查询所有不同数据集/组组合的 max(RunNumber),然后对所有匹配项执行 select *。 任何帮助将不胜感激,在此先感谢!
在 MySQL 5.x 中,您可以使用子查询。
SELECT *
FROM your_table
WHERE (`Group`, Dataset, RunNumber) IN (
SELECT `Group`, Dataset, MAX(RunNumber) AS MaxRunNumber
FROM your_table
GROUP BY `Group`, Dataset
);
在这里测试 db<>fiddle
备择方案
--
-- LEFT JOIN on bigger
--
SELECT t.*
FROM your_table t
LEFT JOIN your_table t2
ON t2.`Group` = t.`Group`
AND t2.Dataset = t.Dataset
AND t2.RunNumber > t.RunNumber
WHERE t2.RunNumber IS NULL
ORDER BY t.`Group`, t.Dataset;
--
-- where NOT EXISTS on bigger
--
SELECT *
FROM your_table t
WHERE NOT EXISTS (
SELECT 1
FROM your_table t2
WHERE t2.`Group` = t.`Group`
AND t2.Dataset = t.Dataset
AND t2.RunNumber > t.RunNumber
)
ORDER BY `Group`, Dataset;
--
-- DENSE_RANK = 1
-- MySql 8 and beyond.
--
SELECT *
FROM
(
SELECT *
, DENSE_RANK() OVER (PARTITION BY `Group`, Dataset ORDER BY RunNumber DESC) AS rnk
FROM your_table
) q
WHERE rnk = 1
ORDER BY `Group`, Dataset;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.