一张表中有张三、李四、王五、、、、、等N个人,这些人中   每个人有多条数据  但是时间不同   
想要的结果:   把张三、李四、王五、、、等人各按时间排序后   取每个人的第一条数据  
注意点:这张表的数据在10W以上,要效率比较好的查询语句  求高手指教啊,共同学习!!!!!!!!!!!!!

解决方案 »

  1.   

    select * from table where time||name in(
    select max(time)||name from table group by name
    )
      

  2.   

    --假设你的表名T, 张三,李四人名列是name, 时间列是tdate
    select * from
    (select t.*, row_number() over (partition by name order by tdate) rn from t)
    where rn = 1;
    --这样查出来是时间最早的数据,如果要最晚的,
    select * from
    (select t.*, row_number() over (partition by name order by tdate desc) rn from t)
    where rn = 1;
      

  3.   

    这样会比MAX更有效率? 请教
      

  4.   

    select max(time)||name from table group by name 这个子查询先根据name列分组,然后再将分组中最大的时间和name列组合起来。这样就形成了一个由name和time组合成的字符串了,例如:20121009ludwik。
    那么这个子查询查询出来的结果就是这样格式的一个结果集。
    然后再去查询全表,对比条件也就是time+name这样一个组合形式。
      

  5.   

    还是对time列加个to_char()函数来转换一下好些。 
      

  6.   


    谢谢  我听懂意思了   
    我想问下   我单独用  select max(time)||name from table group by name  语句查出来的数据怎么比用整个语句查出来的数据还少  不是应该相同吗?   是因为表中的数据有多个 “时间与名称”相同的吗
      

  7.   


    是的。肯定要少,因为这里使用了max函数,然后根据name分组了,那么有相同name的数据,就只有一条会查询出来,就是最大的一条。