一. 前提条件
某表的主键由两个字段A、B构成(或者更多),任何其中一个字段都可能具有重复的数据。
需要只取字段A所有重复数据中的一条构成查询结果,也就是字段A取到所有的可能取值且无重复。
二. 方法一(where ... in + group by)
思路
- 先按A字段分组查字段B的最小值或者最大值
- 再查B字段在1结果集中的所有数据
代码
SELECT *
FROM table_name
WHERE B
IN (SELECT MIN(B) FROM table_name GROUP BY A)
替换:table_name 、A 、B
注意:适用于查询对字段B无要求。
三. 方法二 ( row_number() over(partition by ...) as rowIndex )
思路
- 按照A字段分组,并给组内的所有数据赋从1开始的编号,编号设为新生成的虚拟字段
- 查1结果中的编号和表中的所有数据
- 查2结果中编号为1的所有数据构成最后的结果
代码
select s.*
from ( select *, row_number() over (partition by A ) as group_idx from table_name
) s
where s.group_idx = 1
替换:A 、table_name
补充: select row_number() over(partition by A order by B ) as rowIndex from tableA :为分组字段
B:为分组后的排序字段。
多用于对数据进行分组排序,并对每个组中的数据分别进行编号,编号从1开始递增,每个组内的编号不会重复。
参考来源https://blog.csdn.net/qq_27088383/article/details/111755822