Oracle对查询结果先排序后去重

一、需求的目的是要求查询出考生信息根据考场号和座位号进行升序排序,但是存在同一考生参加多场考试,因此查询结果集对相同人员需要去重保持唯一

原有示例结果集

目标结果集

1、原有SQL仅通过distinct对结果集去重,若在此基础上修改,达到了排列的目的,但去重未生效,因为distinct用于多列结果集的查询时,会综合所有字段结果进行去重,name为小赵的行结果集kaochang和zw两个字段结果不一致导致无法去重

select distinct id,

       name,

       subject,

       kaochang,

       zw

from exam

order by kaochang,zw

2、上述结果集如果不加distinct,在外层再嵌套一层用distinct去重,达到去重目的,但是子查询的结果集被打乱,因为distinct自带排序,打乱原有排序结果集

select distinct id,

       name

from(

select distinct id,

       name,

       subject,

       kaochang,

       zw

from exam

order by kaochang,zw) a

3、不使用distinct完成去重,首先根据列字段根据唯一id进行分组然后按照考场排序,然后根据order by对整个结果集进行排序;在查询语句的外层套一层,查询条件筛选rn=1的结果集,既可以实现对相同人员的去重,也满足按考场和座位的排序

select id,

       name,

       subject,

       kaochang,

       zw

from(

select row_number()over(partition by id order by kaochang) as rn,

       id,

       name,

       subject,

       kaochang,

       zw

from exam

注明:项目碰到的问题,举例说明记录解决思路

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值