如何选择具有唯一元素的最大对子集?

时间:2013-12-09 12:37:47

标签: mysql sql select greatest-n-per-group

假设我有数字对表:

a | b
--+--
1 | 1
2 | 1
3 | 1
2 | 2
4 | 2
5 | 5
1 | 3

对于每个b,我想选择a,例如,对于不同的a,没有2个相同的b

如果我使用group by进行简单查询:

select * from t group by b

我得到以下结果:

a | b
--+--
1 | 1
2 | 2
5 | 5
1 | 3
a == 1b == 1

b == 3

我想要的是这样的事情:

a | b
--+--
3 | 1
2 | 2
5 | 5
1 | 3

你能帮我解决这个问题吗?我假设这种子集查询有一个已知的术语,但我不知道它,这使得更难以寻找答案。

如果查询为给定的a选择最大b,同时保持给定的唯一性约束,则获得奖励积分。对于我的例子,结果将是:

a | b
--+--
3 | 1
4 | 2
5 | 5
1 | 3

4 个答案:

答案 0 :(得分:2)

试试这个

select max(a),b from t group by b;

答案 1 :(得分:2)

我认为第一种方法是:

select MAX(a) as a,
       b
from t as t1
where NOT EXISTS(select a from t where b<>t1.b and a=t1.a)
      or 
      NOT EXISTS(select a from t where a in (select a from t where b=t1.b)
                 GROUP BY a 
                 HAVING COUNT(*)=1)

GROUP BY b

SQLFiddle demo

我们应该按b进行分组,然后从主表的特殊子范围中找到MAX(a)。 首先,我们应该获得另一个a不存在的所有b(这是第一个条件)。 但是在b=3的情况下,我们得到其他a存在所有b的情况,因此第二个条件处理这种情况。

答案 2 :(得分:0)

尝试

 SELECT MAX(`a`) as `a`, `b` FROM Table1 GROUP BY `b`

演示http://sqlfiddle.com/#!2/f4897/8

答案 3 :(得分:-2)

请检查一下,我还没有验证: -

SELECT max(a) AS a, b FROM t WHERE  GROUP BY b