SQL查询如何按成员分组取最新CallDate及最大CallID对应行
问题原因分析
- 原SQL的核心错误是
GROUP BY子句中包含了CallDate和CallID字段:GROUP BY会按照指定的所有字段组合分组,只要两个行的MemberID、FirstName、LastName、CallDate、CallID任意一项不同,就会拆分为独立分组,相当于每一行原始数据单独成组,自然会返回全部记录。 - 同时使用
MAX()聚合和DISTINCT属于冗余写法,没有实际作用。
正确实现方案
方案1:窗口函数写法(兼容MySQL 8.0+/SQL Server/PostgreSQL/Oracle等所有主流新版数据库)
用ROW_NUMBER()按MemberID分组,组内先按CallDate倒序、再按CallID倒序排序,取每个分组排序第一的行即可完全匹配需求:
SELECT MemberID, FirstName, LastName, CallDate, CallID FROM ( SELECT MemberID, FirstName, LastName, CallDate, CallID, ROW_NUMBER() OVER ( PARTITION BY MemberID ORDER BY CallDate DESC, CallID DESC ) AS rn FROM dbo.table ) t WHERE rn = 1 ORDER BY LastName ASC;
方案2:旧版数据库兼容写法(适用于不支持窗口函数的环境,如MySQL 5.x)
通过子查询先拿到每个成员的最新CallDate和对应最大CallID,再关联原表取全字段:
SELECT t1.MemberID, t1.FirstName, t1.LastName, t1.CallDate, t1.CallID FROM dbo.table t1 INNER JOIN ( SELECT MemberID, MAX(CallDate) AS latest_date, MAX(CallID) AS latest_callid FROM dbo.table GROUP BY MemberID ) t2 ON t1.MemberID = t2.MemberID AND t1.CallDate = t2.latest_date AND t1.CallID = t2.latest_callid ORDER BY t1.LastName ASC;
内容的提问来源于stack exchange,提问作者DeAnna
相关产品推荐
相关产品推荐

