数据表如图:
id   name  category_id          date
1    aaa    1            2010-06-10 19:14:37 
2    bbb    2            2010-06-10 19:14:55
3    ccc    1            2010-06-10 19:16:02
4    ddd    1            2010-06-10 19:16:15
5    eee    2            2010-06-10 19:16:35以categroy_id分组后各个分组 最新(时间最大)的两条记录
结果如下:
id   name  category_id          date
3    ccc    1            2010-06-10 19:16:02
4    ddd    1            2010-06-10 19:16:15
2    bbb    2            2010-06-10 19:14:55
5    eee    2            2010-06-10 19:16:35sql语句如下:SELECT * FROM test a WHERE 2> (SELECT COUNT(*) FROM test b WHERE b.category_id = a.category_id AND b.date>a.date) 
ORDER BY a.category_id,a.date;
求讲解一下这个自连接的sql语句如何理解。。额 。

解决方案 »

  1.   

    话说,csdn 的编辑器真难用。。
    这布局,坐等@@@@
      

  2.   

    select categroy_id  from table where  条件 group by categroy_id  having max(date)
      

  3.   

    还可以这样select * from table where 
    categroy_id,date  in (select categroy_id,date  from table where 条件 group by categroy_id,date having max(date))
      

  4.   


    --t用你的表名替换下,最好列名不要用date,不然你用起来很麻烦的
    select id,name,category_id,to_char("date",'yyyy-mm-dd hh24:mi:ss') "date"
    from(
    select rank() over(partition by category_id order by category_id,"date" desc) rk,
    id,name,category_id,"date"
    from t) t1
    where rk<3;
      

  5.   

    哈哈 Oracle的这种分析 函数的用法我也会的,,就是要在mysql里用我上面是一种解决方案--自连接查询。
    但是我觉得不太好理解。 谁能讲解下。。
      

  6.   

     对TEST表的每一行适用WHERE条件,如果对于当前遍历行,TEST表中不存在或只存在一行其时间比当前行大,则改行为时间最新或第二新。