SQL查询需求:按最大initID筛选同title多initID的行
解决方案:筛选重复title对应最大initID的行
要实现你的需求,我们可以分两步处理:先定位那些关联了多个不同initID的title,再提取这些title对应最大initID的所有行。下面提供两种实用的SQL实现方案:
方法一:窗口函数实现(推荐,简洁高效)
利用窗口函数可以一次性计算出每个title的initID数量和对应最大initID,直接筛选符合条件的行:
WITH title_init_stats AS ( SELECT *, -- 统计每个title下不同initID的数量 COUNT(DISTINCT initID) OVER (PARTITION BY title) AS init_count, -- 找出每个title对应的最大initID MAX(initID) OVER (PARTITION BY title) AS max_init_id FROM your_table_name ) SELECT ID, title, revision, initID FROM title_init_stats -- 只保留有多个initID的title,且该行属于最大initID的组 WHERE init_count > 1 AND initID = max_init_id ORDER BY ID;
方法二:子查询关联实现
如果你的数据库不支持窗口函数,可以用子查询先统计关键信息,再和原表关联筛选:
SELECT t.ID, t.title, t.revision, t.initID FROM your_table_name t JOIN ( SELECT title, COUNT(DISTINCT initID) AS init_count, MAX(initID) AS max_init_id FROM your_table_name GROUP BY title -- 先筛选出有多个initID的title HAVING COUNT(DISTINCT initID) > 1 ) stats ON t.title = stats.title AND t.initID = stats.max_init_id ORDER BY t.ID;
结果验证
针对你提供的测试数据,两种方案都会返回你期望的结果:
ID | title | revision | initID 4 | Mytitle 1 | 0 | 20 5 | Mytitle 1 | 1 | 20 10 | Mytitle 3 | 0 | 50 11 | Mytitle 3 | 1 | 50 12 | Mytitle 3 | 2 | 50
逻辑说明
- 先通过
GROUP BY title+COUNT(DISTINCT initID)筛选出关联了多个不同initID的title; - 再对这些
title计算出对应的最大initID; - 最后关联原表,提取所有
title匹配且initID等于最大initID的行。
内容的提问来源于stack exchange,提问作者Cracs
相关产品推荐
相关产品推荐

