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

