假设我有数字对表:
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 == 1
和b == 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
答案 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
我们应该按b
进行分组,然后从主表的特殊子范围中找到MAX(a)
。
首先,我们应该获得另一个a
不存在的所有b
(这是第一个条件)。
但是在b=3
的情况下,我们得到其他a
存在所有b
的情况,因此第二个条件处理这种情况。
答案 2 :(得分:0)
答案 3 :(得分:-2)
请检查一下,我还没有验证: -
SELECT max(a) AS a, b FROM t WHERE GROUP BY b