1

我的表看起来像这样,在 col1 中有重复项

col1,      col2,      col3,      col4
1,            1,            0,            a
1,            2,            1,            a
1,            3,            1,            a
2,            4,            1,            b
3,            5,            0,            c  

我想用 max (col3) 和 min(col2) 选择不同的 col1;所以结果集将是:

col1,      col2,      col3,      col4
1,            2,            1,            a
2,            4,            1,            b
3,            5,            0,            c

我有一个解决方案,但正在寻找最好的想法?

4

1 回答 1

4
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 col1and 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 个声望点之前,您无法执行某些操作。

于 2010-05-11T22:59:44.770 回答