oracle查询根据名称过滤每个人最后的登录时间

topbird2 2014-10-23 10:58:53
加入一个表中有很多字段,我想根据字段(人名,登录时间)和这个名字的最后登录时间进行过滤,最后的得出所有人员的最后登录时间,每个人不能出现重复的。
oracle语句该如何写,希望大侠出招。在线等,谢谢了!
...全文
360 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
bw555 2014-10-24
  • 打赏
  • 举报
回复
rowid没有的话,换一个其他字段也行,只要能区分出这两个一致的登录时间就可以
bw555 2014-10-24
  • 打赏
  • 举报
回复
dense_rank本身获取排序是允许并列的,如果有两个最大,就不知道从那条数据读取数据了 排序条件后面加上rowid,应该就没有这问题了
topbird2 2014-10-24
  • 打赏
  • 举报
回复
ORA-01445: 无法从不带保留关键字的表的联接视图中选择 ROWID 或采样 01445. 00000 - "cannot select ROWID from, or sample, a join view without a key-preserved table" *Cause: *Action: 行 61 列 19 出错
bw555 2014-10-24
  • 打赏
  • 举报
回复
order by 登录时间 改为 order by 登录时间,rowid 即可
topbird2 2014-10-24
  • 打赏
  • 举报
回复
引用 2 楼 bw555 的回复:
还有一种分析函数的写法
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要好,如果数据量较大,建议这种写法
-----------------使用上面的方法查询得到的数据;数据不正确。原因可能是两个登录时间一直的原因,但是也不应该出错啊;如果时间不一样的话,就不会出错了。这是什么原因呢,求解释。。。。。。 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
bw555 2014-10-23
  • 打赏
  • 举报
回复
又想起来一种,这种应该比1#的方法还要慢一点
SELECT * FROM T T1
WHERE 登录时间=(SELECT MAX(登录时间) FROM T WHERE 人名=T1.人名)
bw555 2014-10-23
  • 打赏
  • 举报
回复
5#的方法,补齐
SELECT * FROM 
(select T.*,row_number() over(partation by 人名 order by 登录时间 desc)  rn
from T)
WHERE rn=1
目前来说,应该主要就1#、2#、5#这3种方法,速度的话2#最快
topbird2 2014-10-23
  • 打赏
  • 举报
回复
引用 2 楼 bw555 的回复:
还有一种分析函数的写法
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要好,如果数据量较大,建议这种写法
我是这样的想法,其他的字段也要查出来,但是这种写法确实有点繁琐,谁还有更好发办法?
sych888 2014-10-23
  • 打赏
  • 举报
回复
row_number() over(partation by ... order by ... desc) rn=1
sourcecode1 2014-10-23
  • 打赏
  • 举报
回复
引用 3 楼 huangdh12 的回复:
[quote=引用 1 楼 bw555 的回复:]
select * from T T1
WHERE NOT EXISTS(SELECT 1 FROM T WHERE 人名=T1.人名 AND 登录时间>T1.登录时间)
如果只要人名以及时间的话 select name,max(time) from t group by t.name[/quote] 这个是正解
huangdh12 2014-10-23
  • 打赏
  • 举报
回复
引用 1 楼 bw555 的回复:
select * from T T1
WHERE NOT EXISTS(SELECT 1 FROM T WHERE 人名=T1.人名 AND 登录时间>T1.登录时间)
如果只要人名以及时间的话 select name,max(time) from t group by t.name
bw555 2014-10-23
  • 打赏
  • 举报
回复
还有一种分析函数的写法
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要好,如果数据量较大,建议这种写法
bw555 2014-10-23
  • 打赏
  • 举报
回复
select * from T T1
WHERE NOT EXISTS(SELECT 1 FROM T WHERE 人名=T1.人名 AND 登录时间>T1.登录时间)
卖水果的net 2014-10-23
  • 打赏
  • 举报
回复
4# 和 5# 。

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧