如何无需列出所有列获取每个RequestID的最大创建日期?
解决RequestID重复且获取最大创建日期记录的问题
首先明确:MAX(*)报错是因为聚合函数MAX()只能作用于单个具体列,不能直接搭配通配符*使用。不过你不需要手动列出所有列也能实现需求,以下是两种常用的解决方案:
方案一:使用窗口函数ROW_NUMBER()
这是最灵活的实现方式,无需枚举所有列,直接筛选每个RequestID对应的最新记录:
WITH RankedTickets AS ( SELECT Tick.*, analysis.*, -- 按RequestID分组,每组内按创建日期倒序排,最新记录行号为1 ROW_NUMBER() OVER (PARTITION BY Tick.RequestID ORDER BY Tick.CreatedDate DESC) AS RowNum -- 若CreatedDate字段在analysis表中,替换为analysis.CreatedDate即可 FROM [CMSystemScripts].[dbo].[CMS_CMS_and_MandR_Ticketing] Tick INNER JOIN [dbo].[CMS_CMS_and_MandR_Ticketing_Analysis] analysis ON Tick.RequestID = analysis.RequestID ) SELECT * FROM RankedTickets WHERE RowNum = 1 ORDER BY RequestID;
方案二:子查询先获取最大创建日期,再关联筛选
先提取每个RequestID对应的最大创建日期,再通过这个结果过滤原关联表的记录:
SELECT Tick.*, analysis.* FROM [CMSystemScripts].[dbo].[CMS_CMS_and_MandR_Ticketing] Tick INNER JOIN [dbo].[CMS_CMS_and_MandR_Ticketing_Analysis] analysis ON Tick.RequestID = analysis.RequestID INNER JOIN ( -- 子查询得到每个RequestID的最大创建日期 SELECT RequestID, MAX(CreatedDate) AS MaxCreatedDate FROM [CMSystemScripts].[dbo].[CMS_CMS_and_MandR_Ticketing] GROUP BY RequestID ) MaxDates ON Tick.RequestID = MaxDates.RequestID AND Tick.CreatedDate = MaxDates.MaxCreatedDate ORDER BY Tick.RequestID;
补充说明:如果同一个RequestID存在多条记录共享最大创建日期,方案一会随机保留其中一条;方案二则会返回所有这些同日期的记录。若需要处理这种场景,可以给窗口函数的排序规则添加额外唯一字段(比如ID)来确保结果稳定。
内容的提问来源于stack exchange,提问作者JonnyP22
相关产品推荐
相关产品推荐

