如何获取各唯一ID对应max(time_to_prioritize)的完整行数据?
解决方法
方案1:用窗口函数(最简洁)
这是主流数据库(MySQL 8.0+、SQL Server、PostgreSQL等)都支持的写法,直接按ID分组后给每条数据排序,取每组里时间最新的那条:
SELECT ID, time_to_prioritize, extra_info_1, extra_info_2 FROM ( SELECT *, -- 按ID分组,组内按时间倒序排,每组第一条标记为1 ROW_NUMBER() OVER (PARTITION BY ID ORDER BY time_to_prioritize DESC) AS row_num FROM my_table ) temp WHERE row_num = 1;
如果同一个ID有多条记录的time_to_prioritize是相同的最大值,这个方法只会返回其中一行;要是想保留所有同最大值的行,把ROW_NUMBER()换成RANK()即可。
方案2:子查询关联原表
先找出每个ID对应的最大时间,再用这个结果去匹配原表拿完整行:
SELECT main.* FROM my_table main INNER JOIN ( -- 先分组算出每个ID的最大时间 SELECT ID, MAX(time_to_prioritize) AS latest_time FROM my_table GROUP BY ID ) max_times ON main.ID = max_times.ID AND main.time_to_prioritize = max_times.latest_time;
这个方法会返回所有同ID且时间等于最大值的行,适合需要保留所有极值记录的场景。
你之前的问题出在哪?
SELECT TOP 1 * ...只能拿到全表时间最大的那一行,没法处理每个ID各自的最大值。- 自连接没成功大概率是关联条件没写全——只关联了ID,但没匹配
time_to_prioritize和对应的最大值,导致关联后没找到匹配的数据。
内容的提问来源于stack exchange,提问作者daniel_dutra
相关产品推荐
相关产品推荐

