oracle数据库组内排序应用

真实场景:

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

查询语句:

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排序。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值