假设一评论表messages, 有字段id,content(评论内容),created_at(评论时间),suite_id(设计方案)
id  content   created_at            suite_id
1   dddd     2010-11-18 16:40:51            1
2   ffff     2010-11-18 15:30:51            1
3   hhhh     2010-11-18 13:20:51            2
4   jjjj     2010-11-18 11:50:51            2
按时间倒序显示最新的不同设计的评论信息。(针对同一个设计方案的只显示最新的一条)
是oracle 数据库
select * from messages m where id in 
(select id from messages where suite_id=m.suite_id and rownum<2 
order by created_at desc)
为什么加上order by created_at desc这一句就提示右括号缺失。郁闷啊

解决方案 »

  1.   


    select id,content,create_at,suite_id
    from  
    (select m.*,row_number() over(partition by suite_id order by created_at desc) rn
    from messages m )
    where rn=1
      

  2.   

    --稍微改下就出来了
    select id,content,create_at,suite_id
    from  
    (select m.*,row_number() over(partition by suite_id order by created_at desc) rn
    from messages m )
    where rn=1 and rownum<=10
      

  3.   


    --最后再取不同方案按照时间倒序排列的前10条
    SELECT id,content,create_at,suite_id from (
      --先取出同一种方案的最新记录
      select id,content,create_at,suite_id,Row_Number()over(ORDER BY created_at desc) rn2
      from  
      (select m.*,row_number() over(partition by suite_id order by created_at desc) rn
      from messages m )
      where rn=1 
    )
    where rn2<=10
      

  4.   

     再按时间倒序取10条,你这样取的十条只是各设计方案最新,如果where rn=1 and rownum<=10
    再加个 order by create_at desc ,这样也不对,(它是先取10条再排序了,我意思是先倒排序在取10条)
      

  5.   

    弱弱的问一下:row_number() over(partition by suite_id order by created_at desc)这句是什么意思
      

  6.   


    ROW_NUMBER()说明:返回结果集分区内行的序列号,每个分区的第一行从 1 开始。
    语法:ROW_NUMBER () OVER ( [ <partition_by_clause> ] <order_by_clause> ) 。
    备注:ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。
    参数:<partition_by_clause> :将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。 
          <order_by_clause>:确定将 ROW_NUMBER 值分配给分区中的行的顺序。
    select t.* from messages t where not exists(select 1 from messages where suite_id = t.suite_id and created_at > t.created_at)select t.* from messages t where rownum <= 10 and not exists(select 1 from messages where suite_id = t.suite_id and created_at > t.created_at)