先说需求
1.0 版本
刚开始是在 评论表 里查找 项目名 和 id不重复
我一开始是通过 group by 实现的select PROJECT_ID,PROJECT_NAME
from COMMENT_MESSAGE
where DELFLAG = 0
group by PROJECT_ID,PROJECT_NAME2.0 版本
需求增加,要求查询最近的5条记录。
此需求分为两部分。
1、只查条5数据。2、按时间排序(最近的5条)
首先,我就加了一个 rownum <= 5 ,
然后,我加了createdate字段用来排序代码如下
select PROJECT_ID,PROJECT_NAME,CREATEDATE
from COMMENT_MESSAGE
where DELFLAG = 0
and rownum <= 5
group by PROJECT_ID,PROJECT_NAME,CREATEDATE
order by CREATEDATE desc结果顺利的翻车了。查出来的结果有重复的

这样可用的数据就只有两条了,和需求的5条不符。
我发现出现这样的结果是
因为查询条件里有createdate,
由于createdate是唯一的,所以group by以后原本需要合并的数据无法合并了。
如果把createdate去掉,就没法排序(需求是要求取最近的5条)
为此我实验了好久上网查了许多资料,仍一无法解决问题。
不是结果重复,就是查出来的数据不足5条。
脑壳疼。。。。。
然后在同事的帮助下,用了一个中午,想了一个办法
将查出的数据按 项目id相同的分组排 并序加一个 序号(序号很重要)
再取序号为1的就是既有createdate(可以排序啦~)又唯一的所有数据了
然后再处理这部分数据,将数据 order by 一下,
最终取数据的前5条就可以了代码如下
select * from (
select * from (//括号内的就是按 项目id相同的分组排 并序加一个序号
SELECT PROJECT_ID,PROJECT_NAME,createdate,
Row_Number() OVER (partition by PROJECT_ID ORDER BY createdate desc) rank
FROM COMMENT_MESSAGE
where PROJECT_NAME like concat(concat('%',''),'%')
//这里是因为还有有个模糊搜索的功能
)
where rank=1 //再取序号为1的就是既有createdate又唯一的所有数据了
order by createdate desc//再按时间排序一下
)
where rownum <=5//最后只取前5条(oracle数据库)
order by createdate desc//按时间倒序排列一下至此终于解决 取分组后的按时间倒序的前5条数据了
既兼顾了分组(取相同的数据的唯一一个)
又兼顾了按时间(createdate)排序
最终取5条数据(不多不少)
基本完美。原本我都打算仅仅group by一下 取出所有分组后的数据,然后在java中将数据遍历一遍处理一下,但是想想这样不好,如果数据量大的话,那处理挺耗时间和资源的。
记录并分享一下,增加经验,供大家参考
















