表A
NAME      DATE           COL1
------------------------------
A         2011/06/07     4
A         2011/06/09     6
A         2011/06/03     7
B         2011/06/29     5
B         2011/06/30     6
求查询出每个NAME下的日期最大的结果
NAME      DATE           COL1
------------------------------
A         2011/06/09     6
B         2011/06/30     6
自己写的语句感觉不效率select m."name",m."date",b.col1 from 
(select a."name", MAX(a."date") "date" from tb_test_only a group by "name")m
left join tb_test_only b 
on m."name" =b."name" and m."date" =b."date"

解决方案 »

  1.   

    SELECT *
      FROM a
     WHERE NOT EXISTS (SELECT *
              FROM a b
             WHERE b."name" = a."name"
               AND b."date" > a."date");
      

  2.   

    1.
    select name,date,col1 from (
    select name,date,col1,row_number() over (partition by name order by date desc) rn)
    where rn=1
      

  3.   

    表A
    NAME DATE COL1
    ------------------------------
    A 2011/06/07 4
    A 2011/06/09 6
    A 2011/06/03 7
    B 2011/06/29 5
    B 2011/06/30 6
    求查询出每个NAME下的日期最大的结果
    NAME DATE COL1select * from  a a where a.date = (select max(b.date) from a  b where a.name = b.name)
      

  4.   


    select distinct t.name, max(t.date) over(partition by t.name)
    from table_test t
      

  5.   

    方法很多,看看下面的例子
    --方法1 (NOT EXISTS)
    SELECT *
      FROM emp a
     WHERE NOT EXISTS (SELECT *
              FROM emp b
             WHERE b.deptno = a.deptno
               AND b.hiredate > a.hiredate);
     
    --方法2 (ALL)
    SELECT *
      FROM emp a
     WHERE a.hiredate >= ALL
     (SELECT b.hiredate FROM emp b WHERE b.deptno = a.deptno);
     
    --方法3 (IN)
    SELECT *
      FROM emp a
     WHERE (a.deptno, a.hiredate) IN
           (SELECT b.deptno, MAX(b.hiredate) FROM emp b GROUP BY b.deptno);
     
    --方法4 (IN)    
    SELECT *
      FROM emp a
     WHERE (a.deptno, a.hiredate) IN
           (SELECT MAX(b.deptno), MAX(b.hiredate)
              FROM emp b
             WHERE b.deptno = a.deptno);
     
    --方法5 (ROW_NUMBER)
    SELECT *
      FROM (SELECT a.*,
                   row_number() over(PARTITION BY a.deptno ORDER BY a.hiredate DESC) rn
              FROM emp a)
     WHERE rn = 1;
     
    --方法6 (EXISTS)
    SELECT *
      FROM emp a
     WHERE EXISTS
     (SELECT 1
              FROM emp b
             GROUP BY b.deptno
            HAVING b.deptno = a.deptno AND MAX(b.hiredate) = a.hiredate);
     
    --方法7 (EXISTS)
    SELECT *
      FROM emp a
     WHERE EXISTS (SELECT 1
              FROM emp b
             WHERE b.deptno = a.deptno
             GROUP BY b.deptno
            HAVING MAX(b.hiredate) = a.hiredate);
      

  6.   

    select * from                                                                      
        (                                                                           
        select name,date,col1,rank()over(partition by name order by  date desc) mm from t2
        )                                                                           
        where mm=1 
      

  7.   

    /* Formatted on 2011/07/07 15:43 (Formatter Plus v4.8.8) */
    SELECT *
      FROM (SELECT NAME, DATE, col1,
                   RANK () OVER (PARTITION BY NAME ORDER BY DATE DESC) mm
              FROM t2)
     WHERE mm = 1
      

  8.   

    select name,max(date) from a group by name
      

  9.   


    select name,max(date1),max(col1)keep(dense_rank first order by date1 desc) col1
      from t1
     group by name;
    [TEST@orcl] SQL>with t1 as(
      2  select 'A' name, '2011/06/07' date1, 4 col1 from dual union all
      3  select 'A' name, '2011/06/09' date1, 6 col1 from dual union all
      4  select 'A' name, '2011/06/03' date1, 7 col1 from dual union all
      5  select 'B' name, '2011/06/29' date1, 5 col1 from dual
      6  )select name,max(date1),max(col1)keep(dense_rank first order by date1 desc) col1
      7     from t1
      8    group by name;N MAX(DATE1)       COL1
    - ---------- ----------
    A 2011/06/09          6
    B 2011/06/29          5
      

  10.   

    额是初学者,我是这样的
    select name,max(date) from a group by name;
      

  11.   

    select B.* from (select row_number() over(partition by Name order by Date desc) as rn,A.* from 表A A)B
    where B.rn=1