SELECT col1, MAX(col3) AS col3, MIN(col2) AS col2, MAX(col4) AS col4
FROM MyTable
GROUP BY col1;
你在你的例子中表明你想要一个col4
包含,但你没有说你想要哪个值。您必须将该列放在聚合函数或GROUP BY
子句中。我认为为该组取最大值是可以接受的。
更新: 感谢您的澄清。您正在询问 Stack Overflow 上经常出现的每组最大 n 问题的变体。这是我通常的解决方案:
SELECT t1.*
FROM mytable t1
LEFT OUTER JOIN mytable t3
ON t1.col1 = t3.col1 AND t1.col3 < t3.col3
WHERE t3.col1 IS NULL;
In English: show me the row ( t1
) for which no row is used with the same col1
and a greater value in col3
。有些人使用NOT EXISTS
子查询谓词编写此代码,但我更喜欢这种JOIN
语法。
给出您的示例数据,这是我的测试的输出:
+------+------+------+------+
| col1 | col2 | col3 | col4 |
+------+------+------+------+
| 1 | 2 | 1 | a |
| 1 | 3 | 1 | a |
| 2 | 4 | 1 | b |
| 3 | 5 | 0 | c |
+------+------+------+------+
请注意,值 1 有两行col1
,因为两行都满足连接条件;中不存在具有更大值的其他行col3
。
所以我们需要添加另一个条件来解决平局。您想与in 中值较小col2
的行进行比较,如果不存在这样的行,那么我们找到了 in 中值最小的行col2
。
SELECT t1.*
FROM MyTable t1
LEFT OUTER JOIN MyTable t3
ON t1.col1 = t3.col1 AND t1.col3 < t3.col3
LEFT OUTER JOIN MyTable t2
ON t1.col1 = t2.col1 AND t1.col3 = t2.col3 AND t1.col2 > t2.col2
WHERE t2.col1 IS NULL AND t3.col1 IS NULL;
给出您的示例数据,这是我的测试的输出:
+------+------+------+------+
| col1 | col2 | col3 | col4 |
+------+------+------+------+
| 1 | 2 | 1 | a |
| 2 | 4 | 1 | b |
| 3 | 5 | 0 | c |
+------+------+------+------+
PS:顺便说一句,Stack Overflow 上习惯于编辑您的原始问题并添加详细信息,而不是为您自己的问题添加仅澄清问题的答案。但我知道在您获得超过 1 个声望点之前,您无法执行某些操作。