求一个SQL,就是从一个表中各个类别中选出最新的一条记录!比如有一个表
tab
id    type    ver
-----------------
1     a       100
2     b       102
3     d       105
4     b       101
5     a       111
6     d       121我想选出每一个type类型中ver最大的一个记录,结果应该是
tab
id    type    ver
------------------
2     b       102
5     a       111
6     d       121请问如何做?

解决方案 »

  1.   

    更正一下,如果多一个type级别,请问如何处理,就是现在type有两个层次级别,我想把所有层次级别下的ver最大的选出来(不同type下的纪录name可能有同名的),例如:tab
    id    name    type1    type2    ver
    ------------------------------------
    1     aaa     1        a       100
    2     bbb     1        b       102
    3     ccc     1        d       105
    4     bbb     1        b       101
    5     aaa     1        a       111
    6     ddd     1        d       121
    7     aaa     2        a       131
    8     bbb     2        b       100
    9     ccc     2        d       105     
    10    bbb     2        b       101
    11    aaa     2        a       111
    12    ddd     2        d       121结果应该是:
    tab
    id    name    type1    type2    ver
    ------------------------------------
    2     bbb     1        b       102
    3     ccc     1        d       105
    5     aaa     1        a       111
    6     ddd     1        d       121
    7     aaa     2        a       131
    9     ccc     2        d       105     
    10    bbb     2        b       101
    12    ddd     2        d       121
    请问SQL应该如何写?
      

  2.   

    select a.*
      from tab a,
           (select type1, type2, max(ver) ver from tab group by type1, type2) b
     where a.type1 = b.type1
       and a.type2 = b.type2
       and a.ver = b.ver
    数据量大时注意效率
      

  3.   

    不知道用分区查询行不?哪位大虾发一个分区查询的sql。
      

  4.   

    select *
    from(
    select a.*,row_number()over(partition by type1,type2 order by ver desc) rn
    from tablename)
    where rn=1;
      

  5.   

    select distinct 
    first_value(id)over(partition by type1,type2 order by ver desc) id,
    first_value(name)over(partition by type1,type2 order by ver desc) name,
    type1,type2,max(ver)over(parition by type1,type2) ver
    from tablename;