有一组数据
TRADER_NAME USERID NUM_HITS A_D STOCK_TYPE num
张三          10029 0 3.22580338 T1 1
张三          10029 0 1.73745477 T1 2
张三          10029 0 1.06423676 T1 3
张三          10029 0 0.790478902 UU 4
李四          10191 0 9.54616833 T1 5
李四          10191 0 3.54118586 T1 6
李四          10191 0 2.90064979 T4 7
李四          10191 0 1.33270192 UU 8
李四          10191 0 0.193418801 UU 9
李四          10191 0 -2.59446764 TM 10
小陈          10231 0 0.710478902 T1 11
小陈          10231 0 0.790478902 T4 12
我想查询的结果是
张三 10029 0 3.22580338 T1
李四 10191 0 9.54616833 T1
小陈 10231 0 0.790478902 T4
即三个人中a_d字段值最大的一组数据
我试过这样
select max(a_d),TRADER_NAME from 表名 group by trader_name
这是可以查出来,但是只查出了两个字段,一个是a_d,一个是trader_name,我想把其他字段也查出来,
也就是以trader_name分组,a_d最大值的一条数据,
请问应该怎么写sql语句呢。

解决方案 »

  1.   

    select tbl.* from tbl,
    (select TRADER_NAME,max(a_d) as a_d from tbl group by TRADER_NAME) t
    where tbl.TRADER_NAME=t.TRADER_NAME and tbl.a_d = t.a_d;最大的两条,那就返回两条了。。
      

  2.   

    select *
    from 表名 a
    where not exists (select 1 from 表名 where USERID=a.USERID and A_D>a.A_D)
      

  3.   

    select t.* from tb t where a_d = (select max(a_d) from tb where USERID = t.USERID) order by t.USERIDselect t.* from tb t where not exists (select 1 from tb where USERID = t.USERID and a_d > t.a_d) order by t.USERID
      

  4.   

    --按照USERID查询select t.* from tb t where a_d = (select max(a_d) from tb where USERID = t.USERID) order by t.USERIDselect t.* from tb t where not exists (select 1 from tb where USERID = t.USERID and a_d > t.a_d) order by t.USERID--如果你的姓名不重复,也可以按照姓名查询select t.* from tb t where a_d = (select max(a_d) from tb where TRADER_NAME = t.TRADER_NAME) order by t.USERIDselect t.* from tb t where not exists (select 1 from tb where TRADER_NAME = t.TRADER_NAME and a_d > t.a_d) order by t.USERID
      

  5.   

    对的
    还可以用
    select *
    from(
      select a.*,dense_rank()over(partition by userid order by a_d desc)dk
      from 表名 a)
    where dk=1数据量大的话比较下执行计划
      

  6.   

    create table test 
    (TRADER_NAME varchar2(10), USERID number,NUM_HITS number,A_D number,STOCK_TYPE varchar2(10), num number);
    insert into test values ('张三', 10029, 0, 3.22580338, 'T1', 1);
    insert into test values ('张三', 10029, 0, 1.73745477, 'T1', 2);
    insert into test values ('张三', 10029, 0, 1.06423676, 'T1', 3);
    insert into test values ('张三', 10029, 0, 0.790478902, 'UU', 4);
    insert into test values ('李四', 10191, 0, 9.54616833, 'T1', 5);
    insert into test values ('李四', 10191, 0, 3.54118586, 'T1', 6);
    insert into test values ('李四', 10191, 0, 2.90064979, 'T4', 7);
    insert into test values ('李四', 10191, 0, 1.33270192, 'UU', 8);
    insert into test values ('李四', 10191, 0, 0.193418801, 'UU', 9);
    insert into test values ('李四', 10191, 0, 0.00446764, 'TM', 10);
    insert into test values ('小陈', 10231, 0, 0.710478902, 'T1', 11);
    insert into test values ('小陈', 10231, 0, 0.790478902, 'T4', 12);
    commit;
    select * from test  t;
    select *
      from test a
     where (a.trader_name, a.userid, a.num_hits, a.a_d) in
           (select t.trader_name, t.userid, t.num_hits, max(t.a_d) "t.a_d"
              from test t
             group by t.trader_name, t.userid, t.num_hits);
      

  7.   

    select * from test t;
    select *
      from (select t.*,
                   row_number() over(partition by t.trader_name order by t.a_d desc) rn
              from test t)
     where rn = 1;
      

  8.   

    select * 
    from( 
      select a.*,dense_rank()over(partition by userid order by a_d desc)dk 
      from 表名 a) 
    where dk=1 
      

  9.   

    row_number()比 dense_rank() 合适,避免取多
      

  10.   

    select * 
    from( 
      select a.*,dense_rank()over(partition by userid order by a_d desc)dk 
      from 表名 a) 
    where dk=1 
      

  11.   

    看了这位童鞋的回帖,几乎全是抄袭,顶多改个别名,真是令人发指
    Omz
      

  12.   

    表:tab_testselect * from (select t.*,row_number() over(partition by t.trader_name order by t.a_d desc) rn 
              from tab_test t) 
    where rn = 1 order by num
      

  13.   

    select TRADER_NAME, USERID, NUM_HITS, max(A_D), STOCK_TYPE, num  from 表名
    group by TRADER_NAME, USERID, NUM_HITS, STOCK_TYPE, num  
      

  14.   


    SELECT t.TRADER_NAME,
           t.userid,
           t.num_hits,
           MAX(t.A_D) over (PARTITION BY t.userid) max_a_d,
           t.stock_type,
           t.num
      FROM t;
    使用Oracle的分析函数
      

  15.   

    没注意到你只要第一行,所以修改如下:SELECT TRADER_NAME,userid,num_hits,max_a_d,stock_type,num
      FROM (
      SELECT t.TRADER_NAME, 
            t.userid, 
            t.num_hits, 
            MAX(t.A_D) over (PARTITION BY t.userid) max_a_d
            row_number() over (PARTITION BY t.userid ORDER BY t.A_D) rk, 
            t.stock_type, 
            t.num 
        FROM t) tmp
     WHERE tmp.rk = 1;
      

  16.   

    看到这题,我首先想到的是用分析函数做,毕竟你再怎么自己写的SQL语句效能,没有Oracle自带的分析函数的执行效能高,不然Oracle也不能在8.1.6整出分析函数的说法了,所以对于能用分析函数做的,尽量用分析函数做。楼上了已经给出了很多种解法,不错!都是大虾!