假设一评论表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这一句就提示右括号缺失。郁闷啊
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这一句就提示右括号缺失。郁闷啊
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
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
--最后再取不同方案按照时间倒序排列的前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
再加个 order by create_at desc ,这样也不对,(它是先取10条再排序了,我意思是先倒排序在取10条)
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)