解决方案 »

  1.   

    select * from T T1
    WHERE NOT EXISTS(SELECT 1 FROM T WHERE 人名=T1.人名 AND 登录时间>T1.登录时间)
      

  2.   

    还有一种分析函数的写法
    select 
    人名,MAX(登录时间) 登录时间,
    max(C1)keep(dense_rank last order by 登录时间) C1,
    max(C2)keep(dense_rank last order by 登录时间) C2,
    max(C3)keep(dense_rank last order by 登录时间) C3,
    max(C4)keep(dense_rank last order by 登录时间) C4,
    from T
    GROUP BY 人名
    语句中C1、C2、C3、C4为表中的其他字段,这种写法写起来比较麻烦,但是效率比not exists要好,如果数据量较大,建议这种写法
      

  3.   


    如果只要人名以及时间的话 
    select  name,max(time) from t group by t.name
      

  4.   


    如果只要人名以及时间的话 
    select  name,max(time) from t group by t.name
    这个是正解
      

  5.   

    row_number() over(partation by ... order by ... desc) 
    rn=1
      

  6.   

    5#的方法,补齐
    SELECT * FROM 
    (select T.*,row_number() over(partation by 人名 order by 登录时间 desc)  rn
    from T)
    WHERE rn=1
    目前来说,应该主要就1#、2#、5#这3种方法,速度的话2#最快
      

  7.   

    又想起来一种,这种应该比1#的方法还要慢一点
    SELECT * FROM T T1
    WHERE 登录时间=(SELECT MAX(登录时间) FROM T WHERE 人名=T1.人名)
      

  8.   


    -----------------使用上面的方法查询得到的数据;数据不正确。原因可能是两个登录时间一直的原因,但是也不应该出错啊;如果时间不一样的话,就不会出错了。这是什么原因呢,求解释
    213912 admin    登录 登录   2014-10-24 08:56:56 112.16.50.57 112.16.50.57 Ztal http:Welcome.aspx-----------------原始数据
    213912 admin 登录 Cookie登录 2014-10-24 08:56:56 112.16.10.114 112.16.10.114 app        ssso
    213911 admin 登录 登录 2014-10-24 08:56:56 112.16.50.57 112.16.50.57 Ztal http:Welcome.aspx
      

  9.   

    order by 登录时间
    改为
    order by 登录时间,rowid
    即可
      

  10.   

    ORA-01445: 无法从不带保留关键字的表的联接视图中选择 ROWID 或采样
    01445. 00000 -  "cannot select ROWID from, or sample, a join view without a key-preserved table"
    *Cause:    
    *Action:
    行 61 列 19 出错
      

  11.   

    dense_rank本身获取排序是允许并列的,如果有两个最大,就不知道从那条数据读取数据了
    排序条件后面加上rowid,应该就没有这问题了
      

  12.   

    rowid没有的话,换一个其他字段也行,只要能区分出这两个一致的登录时间就可以