如何在SQL Server查询中获取每个玩家的最大(最新)日期
如何在查询中为每个玩家获取最大日期(最新日期)?
嘿,我看你需要在现有动态SQL的基础上,实现每个玩家仅保留最新创建日期的记录,结合你的数据表结构和现有代码,我给你整理了可行的修改方案:
核心实现思路
要筛选每个玩家的最新记录,最直接的方式是用窗口函数分区排序:给每个玩家的记录按PlayerId分组(分区),然后按DateCreated倒序排号,这样每个玩家组里排在第一的就是最新的那条记录,我们只要保留行号为1的即可。
修改后的完整SQL代码
IF (@pageNumber IS NOT NULL AND @pageSize IS NOT NULL) BEGIN SET @minNumber = (@pageNumber - 1) * @pageSize; SET @maxNumber = @pageNumber * @pageSize; SET @sql = @sql + ' TOP(@maxNumber) ROW_NUMBER () OVER (ORDER BY ' + @orderBy +') AS [RowNumber], '; END ELSE SET @sql = @sql + ' ROW_NUMBER () OVER (ORDER BY ' + @orderBy + ') AS [RowNumber], '; SET @sql = @sql + ' COUNT(*) OVER () AS [RecordCount],* FROM ( -- 先过滤出每个玩家的最新记录 SELECT [PlayerId], [Username], [DateCreated], [Response] FROM ( SELECT [PlayerId], [Username], [DateCreated], [Response], -- 按玩家分区,创建日期倒序排号,最新的记录行号为1 ROW_NUMBER() OVER(PARTITION BY PlayerId ORDER BY DateCreated DESC) AS PlayerRowNum FROM TABLE with (nolock) ) AS PlayerLatestRecords WHERE PlayerLatestRecords.PlayerRowNum = 1 ) AS FilteredLatestData';
关键改动说明
- 新增了内层子查询
PlayerLatestRecords:在这里给每个玩家的记录生成专属行号,最新的记录因为倒序排序,行号会是1。 - 中间层
FilteredLatestData:只保留行号为1的记录,确保每个玩家只有一条最新的记录进入后续的分页逻辑。 - 你原来的分页、行号计数逻辑完全保留,只是数据源换成了已经筛选好的最新记录集合,不影响原有功能。
这样执行后,就能得到你想要的结果:player1和player2各一条最新创建日期的记录,同时还能正常支持分页功能。
内容的提问来源于stack exchange,提问作者user2171512
相关产品推荐
相关产品推荐

