表格式如下, 
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    
请问应该怎么写语句?

解决方案 »

  1.   

    SELECT MAX(ID) ID ,A,MIN(B)B FROM TB GROUP BY A;
      

  2.   

    select max(ID) max_id ,A,min(B) mix_b from tablename group by a; 
      

  3.   

    不好意思,回二楼的,这个语句是错误的,跟我刚开始想的一样,不过应该把MAX改为MIN,因为我要的是ID较小的那一组。
    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值较小的那一行。   
      

  4.   


    没错,一时手打笔误啊,接受斧正啊!select mix(ID) mix_id ,A,min(B) mix_b from tablename group by a; 
      

  5.   

     用分析函数 :
    select * 
    from 
    (select t.*,row_number() over(partition by a order by b asc) rn from tb t) 
    where rn=1; 
      

  6.   

    SQL> select (select tb1.id from tb1 where tb1.b=a1.min_b and rownum=1), a1.*
      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> 
      

  7.   

    也就是按照A的值分组以后,首先比较B的值,取B值最小的行,如果B值最小的行不是唯一,那么再判断ID的值,取ID值较小的那一行:SQL> select a1.id, a1.a, a1.b
      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>