SELECT * FROM (SELECT *, ROW_NUMBER() OVER (PARTITION BY 某字段1 ORDER BY 某字段1,某时间字段2 DESC ) rn FROM table) t WHERE rn = 1
例如 :
EduCompetitionofStudents 表中有重复数据,重复字段除了主键【Id】和创建时间【CreationTime】 不重复以外其他字段都重复,需求是查询过滤掉重复数据,根据某个不应该重复的字段过滤【studentId】
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY StudentId ORDER BY CreationTime DESC) rn FROM EduCompetitionofStudents WHERE CONVERT(varchar(100), CreationTime, 23) = CONVERT(char, dateadd(DD, -1, getdate()), 23) AND CompetitionId=92 AND id IS NOT NULL ) t WHERE rn = 1
分析:
1.根据StudentId分组:PARTITION BY StudentId 按照需求字段排序:ORDER BY CreationTime DESC
2.如果对重复数据有其他条件限制,例如只过滤昨天的重复数据,或者只过滤掉某个特定条件下的重复数据 条件要写在最里层,要条件过后再分组排序
3.分组后取每组第一条:WHERE rn = 1