从表中选择min(col2)和max(col3)的不同col1

时间:2010-05-11 22:56:54

标签: sql greatest-n-per-group

我的表格在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

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

1 个答案:

答案 0 :(得分: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上经常出现的每组最大问题的变化。这是我通常的解决方案:

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;

简体中文:向我显示行(t1),其中不存在具有相同col1的行且col3中的值更大的行。有些人使用NOT EXISTS子查询谓词来编写此内容,但我更喜欢JOIN语法。

以下是给出示例数据的测试结果:

+------+------+------+------+
| col1 | col2 | col3 | col4 |
+------+------+------+------+
|    1 |    2 |    1 | a    |
|    1 |    3 |    1 | a    |
|    2 |    4 |    1 | b    |
|    3 |    5 |    0 | c    |
+------+------+------+------+

请注意,col1值为1有两行,因为两行都满足连接条件; col3中没有更大值的其他行。

所以我们需要添加另一个条件来解决这个问题。您想要与col2中具有较小值的行进行比较,如果不存在此类行,则我们在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个声誉点,否则您无法使用某些操作。