oracle分组排序筛选

本文探讨如何在Oracle数据库中处理分组数据,按照特定条件排序并选取每组的最高分。通过分析`GROUP BY`和`PARTITION BY`的用法,展示在全科成绩表中查询每门学科最高分的解决方案。

oracle分组排序筛选

是不是遇到过这样的场景,我们要按某条件进行分组,分组后对每个组中再按一定条件排序,然后我们再选出每组符合条件的数据,比如我们有一张表,这张表里记录了全班所有人的所有学科的成绩,每条记录中只有一科的成绩,现在要查出每个学科的最高分。

思考

既然要分组,自然会想到 group by, 通过group by 按学科分组,然后再排序,再筛选最高分:

  1. 然而group by 是统计函数 ,经过group by ;
  2. PARTITION BY 是分析函数 可以实现

实现


select ci.mfcustomerid 客户号,
       ci.customername 姓名,
       'IC' 证件类型,
       (case
         when ii.sex = '1' then
          'M'
         else
          'F'
       end) 性别,
       'CN' 国籍,
       ci.certid 身份证号码,
       (case
         when ii.Idcardvaliddate is not null then
          replace(ii.Idcardvaliddate, '/', '')
         else
          '0'
       end) 有效期限,
       'L' 地址类型,
       ba.address1 地址,
       'LM' 联系方式类型,
       ci.Phoneno 联系方式,
       'C' 职业类型,
       (case ii.Occupation
         when '0' then
          '111'
         when '1' then
          '411'
         when '3' then
          '1311'
         when '4' then
          '1311'
         when '5' then
          '1311'
         when '6' then
          '1311'
         when 'X' then
          '711'
         when 'Y' then
          '1611'
         when 'Z' then
          '1611'
         else
          ''
       end) 职业
  from (SELECT a.* 
  FROM (SELECT ROW_NUMBER() OVER(PARTITION BY customerid ORDER BY serialno DESC) rn,
               business_apply.*
          FROM business_apply) a where a.rn=1) ba, customer_info ci, ind_info ii
 where ba.customerid = ci.customerid
   and ci.customerid = ii.customerid;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值