oracle数据库组内排序应用

真实场景:

    公司的一个内容发布网站有一张记录日志的表,我把这张表用来记录用户浏览情况。因为一个用户对同一个内容会有多次浏览,所以表中会有多个记录。原始的表结果大致如下:

查询语句:

select * from jc_log where category=100 and url='1729' order by  log_id desc;

oracle数据库组内排序应用_第1张图片

   现在的需求是,查询出以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'

oracle数据库组内排序应用_第2张图片

   查询得到的结果如上图所示。接下来就很简单了,获取到每一组的第一个及上图数据中的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;

oracle数据库组内排序应用_第3张图片

    完美的根据user_id去重,然后根据log_id排序。

你可能感兴趣的:(笔记记录,数据库,oracle)