分组查询问题,求大神帮忙。

「已注销」 2017-07-27 04:36:57
表结构
id node create_time user
111 lr 15:20:10 a
111 lr 15:30:20 b
111 lr 15:40:30 c
需求,按id和node分组,找出create_time最大的user,例如这道题最后要的结果是
id node user
111 lr c

觉得应该不难,写半天没写出来,求大神帮忙。


...全文
345 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
雨巷啊 2017-08-03
  • 打赏
  • 举报
回复
引用 6 楼 zy9204122009 的回复:
[quote=引用 3 楼 gaojiagang 的回复:]
可以这样的:


SELECT * FROM (
SELECT T.*, MAX(CREATE_TIME) OVER(PARTITION BY ID,NODE) MAX_CREATE_TIME FROM T_TABLE
)WHERE CREATE_TIME = MAX_CREATE_TIME

感觉不太对啊,
一、select t.*, t.rowid from ZY_TEST1 t;这张表的数据是:
1 111 lr 2017/8/1 a AAAzIQAAEAAIUznAAA
2 111 lr 2017/8/9 b AAAzIQAAEAAIUznAAB
3 111 lr 2017/8/10 c AAAzIQAAEAAIUznAAC
4 111 lr 2017/8/12 c AAAzIQAAEAAIUznAAD
5 111 lr 2017/8/12 c AAAzIQAAEAAIUznAAE
二、SELECT * FROM (
SELECT T.*, MAX(CREATE_TIME) OVER(PARTITION BY IDOCID,NODE) MAX_CREATE_TIME FROM ZY_TEST1 T),这个语句查出来的数据并没有分组啊
1 111 lr 2017/8/1 a 2017/8/12
2 111 lr 2017/8/9 b 2017/8/12
3 111 lr 2017/8/12 c 2017/8/12
4 111 lr 2017/8/12 c 2017/8/12
5 111 lr 2017/8/10 c 2017/8/12
三、最后,能查出来数据是因为WHERE条件中的MAX啊,我的数据查出来的是这样
1 111 lr 2017/8/12 c 2017/8/12
2 111 lr 2017/8/12 c 2017/8/12
[/quote]

引用 6 楼 zy9204122009 的回复:
[quote=引用 3 楼 gaojiagang 的回复:]
可以这样的:


SELECT * FROM (
SELECT T.*, MAX(CREATE_TIME) OVER(PARTITION BY ID,NODE) MAX_CREATE_TIME FROM T_TABLE
)WHERE CREATE_TIME = MAX_CREATE_TIME

感觉不太对啊,
一、select t.*, t.rowid from ZY_TEST1 t;这张表的数据是:
1 111 lr 2017/8/1 a AAAzIQAAEAAIUznAAA
2 111 lr 2017/8/9 b AAAzIQAAEAAIUznAAB
3 111 lr 2017/8/10 c AAAzIQAAEAAIUznAAC
4 111 lr 2017/8/12 c AAAzIQAAEAAIUznAAD
5 111 lr 2017/8/12 c AAAzIQAAEAAIUznAAE
二、SELECT * FROM (
SELECT T.*, MAX(CREATE_TIME) OVER(PARTITION BY IDOCID,NODE) MAX_CREATE_TIME FROM ZY_TEST1 T),这个语句查出来的数据并没有分组啊
1 111 lr 2017/8/1 a 2017/8/12
2 111 lr 2017/8/9 b 2017/8/12
3 111 lr 2017/8/12 c 2017/8/12
4 111 lr 2017/8/12 c 2017/8/12
5 111 lr 2017/8/10 c 2017/8/12
三、最后,能查出来数据是因为WHERE条件中的MAX啊,我的数据查出来的是这样
1 111 lr 2017/8/12 c 2017/8/12
2 111 lr 2017/8/12 c 2017/8/12
[/quote]
这个已经分组了,只不过是最大时间有两个,你把这两个其中一个的id或者node改下就可以看出来分组了。


要是想只要一条数据的话可以这样

SELECT * FROM (
SELECT T.*, ROW_NUMBER() OVER(PARTITION BY ID,NODE ORDER BY CREATE_TIME DESC) RN FROM T_TABLE
)WHERE RN= 1
mayanzs 2017-08-02
  • 打赏
  • 举报
回复
select * from (select id,node,create_time,user, row_number() over(partition by id,node order by create_time desc) mm from t_table) a where a.mm=1 用 row_number() 以避免重复数据
zy9204122009 2017-08-01
  • 打赏
  • 举报
回复
引用 3 楼 gaojiagang 的回复:
可以这样的:

SELECT * FROM (
SELECT T.*, MAX(CREATE_TIME) OVER(PARTITION BY ID,NODE)  MAX_CREATE_TIME FROM  T_TABLE
)WHERE CREATE_TIME = MAX_CREATE_TIME
感觉不太对啊, 一、select t.*, t.rowid from ZY_TEST1 t;这张表的数据是: 1 111 lr 2017/8/1 a AAAzIQAAEAAIUznAAA 2 111 lr 2017/8/9 b AAAzIQAAEAAIUznAAB 3 111 lr 2017/8/10 c AAAzIQAAEAAIUznAAC 4 111 lr 2017/8/12 c AAAzIQAAEAAIUznAAD 5 111 lr 2017/8/12 c AAAzIQAAEAAIUznAAE 二、SELECT * FROM ( SELECT T.*, MAX(CREATE_TIME) OVER(PARTITION BY IDOCID,NODE) MAX_CREATE_TIME FROM ZY_TEST1 T),这个语句查出来的数据并没有分组啊 1 111 lr 2017/8/1 a 2017/8/12 2 111 lr 2017/8/9 b 2017/8/12 3 111 lr 2017/8/12 c 2017/8/12 4 111 lr 2017/8/12 c 2017/8/12 5 111 lr 2017/8/10 c 2017/8/12 三、最后,能查出来数据是因为WHERE条件中的MAX啊,我的数据查出来的是这样 1 111 lr 2017/8/12 c 2017/8/12 2 111 lr 2017/8/12 c 2017/8/12
zhkl125 2017-08-01
  • 打赏
  • 举报
回复
引用 5 楼 u012280886 的回复:
select * from table t where t.create_time=( select max(t2.create_time) from table t2 )
这个我看行啊 如果CREATE_TIME和USER定长的话(USER不定长也行,需要修改下),可以用下面变态的:
SELECT ID,NODE,SUBSTR(MAX(CREATE_TIME||USER),9,1) 
FROM T
GROUP BY ID,NODE
junes06 2017-08-01
  • 打赏
  • 举报
回复
select * from (select id,node,create_time,user, rank()over(partition by id,node order by create_time desc) mm from t_table) a where a.mm=1
qiaobianhongye 2017-07-28
  • 打赏
  • 举报
回复
select * from table t where t.create_time=( select max(t2.create_time) from table t2 )
「已注销」 2017-07-27
  • 打赏
  • 举报
回复
可用,多谢大神,看来我和正确到答案的距离就差一个partition by,一直不会用这个,好好研究下。
雨巷啊 2017-07-27
  • 打赏
  • 举报
回复
可以这样的:

SELECT * FROM (
SELECT T.*, MAX(CREATE_TIME) OVER(PARTITION BY ID,NODE)  MAX_CREATE_TIME FROM  T_TABLE
)WHERE CREATE_TIME = MAX_CREATE_TIME
「已注销」 2017-07-27
  • 打赏
  • 举报
回复
不行啊,子查询分组时不带user的话就查不出来user,带user又会分成三组。
Bad_Milo_ 2017-07-27
  • 打赏
  • 举报
回复

select  a.id,a.node,a.user from (select  id,node,max(create_time),user from 表 group by id,node) a

17,086

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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