按照某个字段分组,然后按时间降序排序 取每组第一条


 

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

 

 

 

 


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM