我的表格在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
我有一个解决方案,但寻找最好的想法?
答案 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个声誉点,否则您无法使用某些操作。