欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

oracle数据库组内排序应用

程序员文章站 2024-03-20 23:37:58
...

真实场景:

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

查询语句:

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

oracle数据库组内排序应用

   现在的需求是,查询出以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数据库组内排序应用

   查询得到的结果如上图所示。接下来就很简单了,获取到每一组的第一个及上图数据中的row_number为1的前30条数据,然后再进行log_id排序就行了。

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
and rownum <= 30
order by log_id desc

oracle数据库组内排序应用

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

相关标签: 笔记记录