使用GROUP BY与INNER JOIN获取按最大日期筛选的唯一值
SQL Server 获取每组最新行的解决方案
原SQL的问题
你的代码存在语法和逻辑错误:
INNER JOIN语法错误:子查询必须用括号包裹,且ON条件的多条件要使用AND连接,不能用逗号GROUP BY位置错误:SQL执行顺序要求GROUP BY必须放在JOIN之后,不能前置- 仅通过分组获取最大时间无法拿到该行完整数据,必须关联原表匹配对应记录
推荐方案:窗口函数法
使用ROW_NUMBER()窗口函数,按SalesPerson和Country分组,按Upload_DateTime倒序标记行号,取每组行号为1的记录(即最新行):
SELECT * FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY SalesPerson, Country ORDER BY Upload_DateTime DESC) AS rn FROM [dbo].[CommentTable] ) AS temp WHERE temp.rn = 1;
如果同一SalesPerson+Country组合下有多个相同的最新Upload_DateTime,且需要保留所有这些行,可将ROW_NUMBER()替换为RANK()或DENSE_RANK()。
修正你的GROUP JOIN思路
先通过子查询获取每组的最新时间,再关联原表拿到完整行数据:
SELECT t2.* FROM ( SELECT SalesPerson, Country, MAX(Upload_DateTime) AS Latest_Upload_Time FROM [dbo].[CommentTable] GROUP BY SalesPerson, Country ) AS t1 INNER JOIN [dbo].[CommentTable] AS t2 ON t1.SalesPerson = t2.SalesPerson AND t1.Country = t2.Country AND t1.Latest_Upload_Time = t2.Upload_DateTime;
内容的提问来源于stack exchange,提问作者Bing
相关产品推荐
相关产品推荐

