在查询数据时如果有重复,我们知道可以用 distinct 去除重复值,但使用 distinct 只能去除所有查询列都相同的记录,如果有一个字段不同,distinct 就无法去重。
select ID , 编码, 姓名 from person where 姓名='李四'但我们还想要实现这样的效果,这时我们可以用 row_number()over(partitioon by column1 order by column2) 先进行分组。根据 COLUMN1 分组,在分组内部根据 COLUMN2 排序,结果表示为每组内部排序后的顺序编号,这个编号在组内是连续且的。
select ID , 编码, 姓名 ,ROW_NUMBER()over(partition by 姓名 order by ID desc) as new_id --对姓名进行分组,对id进行从大到小排序 from person where name='李四'再根据新生成的值作为条件,取出每组中的某个值。通常情况下取大值或小值,其它情况看需求。
一般将上述语句,看做为一个新表,如临时表,或外嵌查询 select。以临时表为例。
select ID , 编码, 姓名 ,ROW_NUMBER()over(partition by 姓名 order by ID desc) as new_id --对姓名进行分组,对id进行从大到小排序 into #aa from person where name='李四'select * from #aa where new_id=1就是为了去除重复值。将重复值分组,按大值排序,取条。