You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 05:15:08