有如下表
表t
字段1,字段2,字段3
1       201    aa
1       201    bb
1       200    cc
2       301    dd
2       301    ee
2       300    ff
3       401    gg
3       401    hh
3       400    ii
想得到如下结果,1       201    aa
2       301    dd
3       401    gg也就是说字段2有重复的话,只取一个,我用max()查,它却把重复的全列出来了,
以上请高手指点啊!

解决方案 »

  1.   

    select m.* from t m where not exists(select 1 from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) order by m.字段1
      

  2.   

    create table t(字段1 int,字段2 int,字段3 varchar(10))
    insert into t values(1 ,201 ,'aa')
    insert into t values(1 ,201 ,'bb')
    insert into t values(1 ,200 ,'cc')
    insert into t values(2 ,301 ,'dd')
    insert into t values(2 ,301 ,'ee')
    insert into t values(2 ,300 ,'ff')
    insert into t values(3 ,401 ,'gg')
    insert into t values(3 ,401 ,'hh')
    insert into t values(3 ,400 ,'ii')
    goselect m.* from t m where not exists(select 1 from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) order by m.字段1drop table t/*
    字段1         字段2         字段3        
    ----------- ----------- ---------- 
    1           201         aa
    2           301         dd
    3           401         gg(所影响的行数为 3 行)*/
      

  3.   

    --sql 2000
    create table t(字段1 int,字段2 int,字段3 varchar(10))
    insert into t values(1 ,201 ,'aa')
    insert into t values(1 ,201 ,'bb')
    insert into t values(1 ,200 ,'cc')
    insert into t values(2 ,301 ,'dd')
    insert into t values(2 ,301 ,'ee')
    insert into t values(2 ,300 ,'ff')
    insert into t values(3 ,401 ,'gg')
    insert into t values(3 ,401 ,'hh')
    insert into t values(3 ,400 ,'ii')
    goselect m.* from t m where not exists(select 1 from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) order by m.字段1/*
    字段1         字段2         字段3        
    ----------- ----------- ---------- 
    1           201         aa
    2           301         dd
    3           401         gg(所影响的行数为 3 行)*/select 字段1,字段2,字段3 from
    (
      select m.* , px = (select count(1) from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) + 1 from t m
    ) k where px = 1 
    order by 字段1
    /*
    字段1         字段2         字段3        
    ----------- ----------- ---------- 
    1           201         aa
    2           301         dd
    3           401         gg(所影响的行数为 3 行)*/
    drop table t
    --sql 2005
    create table t(字段1 int,字段2 int,字段3 varchar(10))
    insert into t values(1 ,201 ,'aa')
    insert into t values(1 ,201 ,'bb')
    insert into t values(1 ,200 ,'cc')
    insert into t values(2 ,301 ,'dd')
    insert into t values(2 ,301 ,'ee')
    insert into t values(2 ,300 ,'ff')
    insert into t values(3 ,401 ,'gg')
    insert into t values(3 ,401 ,'hh')
    insert into t values(3 ,400 ,'ii')
    goselect m.* from t m where not exists(select 1 from t where 字段1=m.字段1 and (字段2 > m.字段2 or (字段2 = m.字段2 and 字段3 < m.字段3))) order by m.字段1/*
    字段1         字段2         字段3
    ----------- ----------- ----------
    1           201         aa
    2           301         dd
    3           401         gg(3 行受影响)*/select 字段1,字段2,字段3 from
    (
      select m.* , px = row_number() over(partition by 字段1 order by 字段2 desc , 字段3) from t m
    ) k where px = 1 
    order by 字段1
    /*
    字段1         字段2         字段3
    ----------- ----------- ----------
    1           201         aa
    2           301         dd
    3           401         gg(3 行受影响)*/
    drop table t
      

  4.   

    select * from 
    (
    select 
    t.*, ROW_NUMBER() over (partition by c1 order by c2 desc, c3) od
    from t
    ) tt
    where od = 1
      

  5.   

    再次问一下楼上的大侠,我用ROW_NUMBER() over 查的是最大的值,如果查最小值应该用什么函数?