真实场景:
公司的一个内容发布网站有一张记录日志的表,我把这张表用来记录用户浏览情况。因为一个用户对同一个内容会有多次浏览,所以表中会有多个记录。原始的表结果大致如下:
查询语句:
select * from jc_log where category=100 and url='1729' order by log_id desc;
现在的需求是,查询出以log_id进行降序的前30条记录结果,并且user_id是去重后的,也就是说user_id不能重复出现两次。
这个需求一开始让我毫无办法,直到到网上查询到组内排序的这个概念。
组内排序大概的意思是:先将数据进行分组,然后分别对每一组的数据进行排序。
组内排序语句:
select t3.*,row_number() over(partition by t3.user_id order by t3.log_id desc) row_number
from jc_log t3 where category=100 and url ='1729'
查询得到的结果如上图所示。接下来就很简单了,获取到每一组的第一个及上图数据中的row_number为1的前30条数据,然后再进行log_id排序就行了。
select t2.* from (
select t.* from (
select t3.*,row_number() over(partition by t3.user_id order by t3.log_id desc) row_number
from jc_log t3
where category=100
and url ='1729'
) t
where t.row_number = 1
order by log_id desc)t2
where rownum <=30;
完美的根据user_id去重,然后根据log_id排序。
来源:CSDN
作者:伍。陆。柒
链接:https://blog.csdn.net/qq_38951990/article/details/103918418