表格式如下,
ID A B
1 1 23
2 1 17
3 2 1
4 2 7
5 2 10
6 3 19
7 3 21
8 3 15
9 4 88
10 3 5
11 4 88
要求查询的条件:A组中值相同的为一组,在相同组中选出B值最小的,如果同组中B列最小值相等(如ID9,ID11),则选出ID值较小的那一组值。最后结果如下所示: ID A B
2 1 17
3 2 1
10 3 5
9 4 88
请问应该怎么写语句?
ID A B
1 1 23
2 1 17
3 2 1
4 2 7
5 2 10
6 3 19
7 3 21
8 3 15
9 4 88
10 3 5
11 4 88
要求查询的条件:A组中值相同的为一组,在相同组中选出B值最小的,如果同组中B列最小值相等(如ID9,ID11),则选出ID值较小的那一组值。最后结果如下所示: ID A B
2 1 17
3 2 1
10 3 5
9 4 88
请问应该怎么写语句?
SELECT MAX(ID) ID ,A,MIN(B)B FROM TB GROUP BY A;
表格式如下,
ID A B
1 1 23
2 1 17
3 2 1
4 2 7
5 2 10
6 3 19
7 3 21
8 3 15
9 4 188
10 3 5
11 4 88
12 4 88
现在把这个问题进一步具体说明,增加一列(上图中已用红色表示修改内容),这是如果用SELECT MAX(ID) ID ,A,MIN(B)B FROM TB GROUP BY A就会显示如下:
ID A B
2 1 17
3 2 1
10 3 5
9 4 77
而我要的结果仍然必须是:
ID A B
2 1 17
3 2 1
10 3 5
11 4 88 也就是按照A的值分组以后,首先比较B的值,取B值最小的行,如果B值最小的行不是唯一,那么再判断ID的值,取ID值较小的那一行。
没错,一时手打笔误啊,接受斧正啊!select mix(ID) mix_id ,A,min(B) mix_b from tablename group by a;
select *
from
(select t.*,row_number() over(partition by a order by b asc) rn from tb t)
where rn=1;
2 from(
3 select a.A,min(a.B) min_b from tb1 a group by a.a
4 )a1
5 ;(SELECTTB1.IDFROMTB1WHERETB1.B A MIN_B
------------------------------ ---------- ----------
2 1 17
3 2 1
10 3 5
11 4 88SQL>
2 from(
3 select t.*,row_number() over(partition by a order by b asc) rn from tb1 t
4 )a1
5 where rn=1; ID A B
---------- ---------- ----------
2 1 17
3 2 1
10 3 5
11 4 88SQL>