表1:table_res
id     name  ......//列名
one    name1
two    name2
three  name3表2:table_valueid            time             value    //列名
three    2013-09-16 10:55       33%
one      2013-09-16 10:56       22%
two      2013-09-16 09:55       35%
three    2013-09-16 11:53       43%
two      2013-09-16 10:38       33%
one      2013-09-16 12:55       17%
我想要的效果就是 
id            time               value  //列名
three    2013-09-16 11:53         43%
one      2013-09-16 12:55         17%
two      2013-09-16 10:38         33%
即id 不能重复,而且time为离现在时间最近的time,value 查出来。
求高手帮忙写个sql语句,谢谢了。 

解决方案 »

  1.   

    with ax as(
    select 'three' id,  '2013-09-16 10:55'  time,     '33%' value from dual union all
    select 'one'   id,  '2013-09-16 10:56'   time ,  '22%'   value from dual union all
    select 'two'   id,  '2013-09-16 09:55'  time,    '35%'  value from dual union all
    select 'three' id, '2013-09-16 11:53'   time ,   '43%'  value from dual union all
    select 'two'   id,  '2013-09-16 10:38'   time,    '33%'  value from dual union all
    select 'one'   id,  '2013-09-16 12:55'   time ,   '17%'  value from dual
    )
    select id,max(time),max(value) from ax group by id不知道是不是你要的结果
      

  2.   

    with table_res as
    (
         select 'one' id ,'name1' name from dual union all
         select 'two' id ,'name2' name from dual union all
         select 'three' id ,'name3' name from dual
    ),table_value as
    (
         select 'three' id ,'2013-09-16 10:55' time,'33%' value from dual union all    
         select 'one' id ,'2013-09-16 10:56' time,'22%' value from dual  union all
         select 'two' id ,'2013-09-16 19:55' time,'35%' value from dual  union all
         select 'three' id ,'2013-09-16 11:53' time,'43%' value from dual  union all
         select 'two' id ,'2013-09-16 10:38' time,'33%' value from dual  union all
         select 'one' id ,'2013-09-16 12:55' time,'17%' value from dual
    )select id,time,value
    from
    (
    select a.id,b.time,b.value,
           row_number() over(partition by a.id order by b.time desc) rn
    from table_res a left join table_value b on a.id = b.id
    )
    where rn = 1
      

  3.   

    格式乱掉了,是你要的结果吗?
    select id,max(time),max(value) from table_value group by id
      

  4.   

    不是。你现在的value是取的是最大值,我要的效果是这个值就是那个sampletime列的值。
      

  5.   


    那你这样吧:
    with ax as(
    select 'three' id,  '2013-09-16 10:55'  time,     '33%' value from dual union all
    select 'one'   id,  '2013-09-16 10:56'   time ,  '22%'   value from dual union all
    select 'two'   id,  '2013-09-16 09:55'  time,    '35%'  value from dual union all
    select 'three' id, '2013-09-16 11:53'   time ,   '43%'  value from dual union all
    select 'two'   id,  '2013-09-16 10:38'   time,    '33%'  value from dual union all
    select 'one'   id,  '2013-09-16 12:55'   time ,   '17%'  value from dual
    )
    select id,time,value from ax where id||time in(
    select id||max(time) time from ax group by id
    )
      

  6.   

    其实我table_value表还有一列字段code ,里面存了‘a’,'b','c'.用你这个结果查出来的全是一类,我自己的话原本想通过where code='a'之类的话的,知道为什么吗?
      

  7.   

    那先过滤 在排序
    select id,time,value
    from
    (
    select a.id,b.time,b.value,
           row_number() over(partition by a.id order by b.time desc) rn
    from table_res a 
         left join (select * from table_value where code='a') b on a.id = b.id
    )
    where rn = 1