SQL查询多列时仅对case_number单列去重的实现方案咨询
SQL仅按case_number单列去重返回多列数据实现方案
核心逻辑为给每个case_number分组内的行做排序标记,筛选出每组内的第一行即可,以下是两种通用实现方案:
方案1:窗口函数法(兼容MySQL 8.0+、PostgreSQL、SQL Server、Oracle等所有支持SQL:2003标准的数据库)
该方案灵活度最高,可自定义每组保留行的规则,示例默认保留每个case_number最新录入的行:
WITH ranked_tickets AS ( SELECT case_number, name, date_entered, -- 按case_number分组,组内按date_entered倒序排序,最新的行标记为1 ROW_NUMBER() OVER (PARTITION BY case_number ORDER BY date_entered DESC) AS row_rank FROM ticket ) SELECT case_number, name, date_entered FROM ranked_tickets WHERE row_rank = 1 ORDER BY date_entered;
如果需要保留每个case_number最早录入的行,把ORDER BY date_entered DESC改成ORDER BY date_entered ASC即可。
方案2:子查询关联法(兼容MySQL 5.x等不支持窗口函数的低版本数据库)
通过分组先拿到每个case_number对应的目标date_entered,再关联原表拿到完整行数据:
SELECT t1.case_number, t1.name, t1.date_entered FROM ticket t1 INNER JOIN ( -- 先取每个case_number的最新录入日期,需要最早的就把MAX改成MIN SELECT case_number, MAX(date_entered) AS target_date FROM ticket GROUP BY case_number ) t2 ON t1.case_number = t2.case_number AND t1.date_entered = t2.target_date ORDER BY t1.date_entered;
注意:如果同一个case_number存在多条date_entered完全相同的行,该方案会返回所有匹配的行,可额外增加自增主键等唯一字段的判断实现精确去重。
内容的提问来源于stack exchange,提问作者mo3bius
相关产品推荐
相关产品推荐

