表结构
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觉得应该不难,写半天没写出来,求大神帮忙。

解决方案 »

  1.   


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

  2.   

    不行啊,子查询分组时不带user的话就查不出来user,带user又会分成三组。
      

  3.   

    可以这样的:
    SELECT * FROM (
    SELECT T.*, MAX(CREATE_TIME) OVER(PARTITION BY ID,NODE)  MAX_CREATE_TIME FROM  T_TABLE
    )WHERE CREATE_TIME = MAX_CREATE_TIME
      

  4.   

    可用,多谢大神,看来我和正确到答案的距离就差一个partition by,一直不会用这个,好好研究下。
      

  5.   

    select * from table t where t.create_time=(
    select max(t2.create_time) from table t2 )
      

  6.   

    感觉不太对啊,
    一、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
      

  7.   

    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
      

  8.   

    这个我看行啊
    如果CREATE_TIME和USER定长的话(USER不定长也行,需要修改下),可以用下面变态的:
    SELECT ID,NODE,SUBSTR(MAX(CREATE_TIME||USER),9,1) 
    FROM T
    GROUP BY ID,NODE
      

  9.   

    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() 以避免重复数据
      

  10.   

    感觉不太对啊,
    一、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
    感觉不太对啊,
    一、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

    这个已经分组了,只不过是最大时间有两个,你把这两个其中一个的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