一、需求的目的是要求查询出考生信息根据考场号和座位号进行升序排序,但是存在同一考生参加多场考试,因此查询结果集对相同人员需要去重保持唯一
原有示例结果集
目标结果集
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
注明:项目碰到的问题,举例说明记录解决思路