有个数据表 table1字段:fid(int)  node_id, temperature(double),      time(varchar2)            original_time(varchar2)
1          00005        25.3                 2011-08-24 00:00            2011-08-24 00:00:01
2          00005        25.6                 2011-08-24 00:00           2011-08-24 00:00:02
3          00005        26.7                 2011-08-24 00:00           2011-08-24 00:00:03
4          00006        27.8                2011-08-24 01:00           2011-08-24 01:00:03
8          00006        24.3                2011-08-24 01:00           2011-08-24 01:00:04
6          00006        27.8                2011-08-24 01:00           2011-08-24 01:00:05
7          00005        28.9                2011-08-24 02:00           2011-08-24 02:00:01
5          00005        29.5                2011-08-24 02:00           2011-08-24 02:00:02得出下面列表:   fid      node_id  temperature
    3        00005     26.7
    6        00006     27.8
    5        00005     29.5根据original_time 日期时间的最晚记录 获取每组time和node_id记录.

解决方案 »

  1.   


      select min(fid)keep(dense_ranke first order by original_time desc) fid,
             min(node_id)keep(dense_ranke first order by original_time desc) node_id,
             min(temperature)keep(dense_ranke first order by original_time desc) temperature
        from table1;
     
      

  2.   


    --没注意到你还要求分组
    select min(fid)keep(dense_ranke first order by original_time desc) fid,
             min(node_id)keep(dense_ranke first order by original_time desc) node_id,
             min(temperature)keep(dense_ranke first order by original_time desc) temperature
        from table1
      group by time,node_id;
      

  3.   


    select fid,node_id,temperature from 
    (
    select fid,node_id,temperature,
    row_number() over(partition by time,node_id order by original_time DESC) rn
    from table1 
    where rn < 2
    )
      

  4.   

    dense_ranke 在PL/SQL 编译没通过呢 ORA-02000 缺失dense_ranke 关键字
      

  5.   

    楼上的应该有点error吧   select aa.fid,aa.node_id,aa.temperature from 
    (
    select fid,node_id,temperature,
    row_number() over(partition by time,node_id order by original_time DESC) rn
    from table1 
    )aa
    where aa.rn < 2
      

  6.   

    3楼 那个运行也是没通过菜鸟一个 不是很熟oracle10G  能不能弄个可以在 PL/SQL developer 能运行通过的?
      

  7.   

    3楼的不太好用吧。
    where语句里的rn,不可以直接这么用吧。
      

  8.   

    这样可以了:
    select min(fid)keep(dense_rank first order by original_time desc) fid,
             min(node_id)keep(dense_rank first order by original_time desc) node_id,
             min(temperature)keep(dense_rank first order by original_time desc) temperature
        from table1
      group by time,node_id;
    dense_rank 是干什么用的?
      

  9.   

    回复10楼美眉,dense_rank 是排序用的。
    --说了多写一个E了
    select min(fid)keep(dense_rank first order by original_time desc) fid,
             min(node_id)keep(dense_rank first order by original_time desc) node_id,
             min(temperature)keep(dense_rank first order by original_time desc) temperature
        from table1
      group by time,node_id;