对ORACAL的SQL语句不是很熟悉,向高手提问,谢谢指教假设我有表A  由以下三列组成序号     更新时间                    姓名   身份证号
=========================================================
01345   2008-5-1 16:03:25      张三   。
01345   2008-5-1 16:15:34      张三   。
01346   2008-4-2 03:10:43      李四   。
01347   2008-5-10 12:05:20     王五   。我想取出某个同一序号中最大的更新时间的所有记录(过滤掉重复的同姓名和身份证号),该怎么做?我取出的记录集应该是这样样子序号     更新时间                    姓名   身份证号
=========================================================
01345   2008-5-1 16:03:25      张三   。
01346   2008-4-2 03:10:43      李四   。
01347   2008-5-10 12:05:20     王五   。

解决方案 »

  1.   

    select *
    from
    (
    select a.* ,row_number() over (partition by 序号,姓名,身份证号 order by 更新时间 desc) rn
    from a
    )
    where rn=1
      

  2.   

    方法2select a.*
    from a,
    (
        select 序号    , max(更新时间)  更新时间, 姓名, 身份证号 
              from a
            group by 序号    ,姓名, 身份证号 
    ) b
    where a. 序号=b. 序号 
    and a.更新时间=b.更新时间
    and a.姓名=b.姓名
    and a.身份证号=b.身份证号
      

  3.   


    where條件需要跟那么多嗎?只序號和更新時間相等不可以嗎?
      

  4.   

    麻烦SQL语句写的格式清楚点 本来对ORACLE语句都不熟悉。 谢谢
      

  5.   

    方法一,语法简单,大数据时可能没方法2效率高select * 
      from 
      ( 
       select a.* ,
           row_number() over (partition by 序号,姓名,身份证号 order by 更新时间 desc) rn 
         from a 
      ) 
    where rn=1方法2,语法复杂点,如果有索引列,在大数据时,可能会比方法1快select a.*
        from a,
        (
            select 序号    , max(更新时间)  更新时间, 姓名, 身份证号 
                    from a
                  group by 序号    ,姓名, 身份证号 
         ) b
    where a. 序号=b. 序号 
           and a.更新时间=b.更新时间
           and a.姓名=b.姓名
           and a.身份证号=b.身份证号
    不知道楼主对格式的要求是什么,这还不行,就没法写了
      

  6.   

    heho2005 多谢了 测试后给分你 你说的格式要求是什么意思?麻烦解释一下
      

  7.   

    用 group by 再having 不行码?