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

MySQL查询筛选仅含较大Number值的部分重复记录

问题描述

在MySQL数据库的某张表中,存在多组仅Number列值不同的记录对,示例数据如下:

| FirstName|LastName |Number|
| -------- | ------- |------|
| John     | Smith   |15    |
| John     | Smith   |32    |
....
| Sarah    | Baker   |8     |
| Sarah    | Baker   |14    |
....

需要编写SQL查询语句,实现两个要求:

  1. 仅筛选出每组重复记录中Number值较大的那条
  2. 排除仅存在单条记录的用户(即每人只有一条记录的情况)

预期查询结果如下:

| John     | Smith   |32    |
| Sarah    | Baker   |14    |
解决方案

假设表名为your_table,以下提供两种可行的SQL写法:

方法一:兼容所有MySQL版本(使用分组+子查询)

SELECT t.FirstName, t.LastName, t.Number
FROM your_table t
INNER JOIN (
    SELECT FirstName, LastName, MAX(Number) AS max_num
    FROM your_table
    GROUP BY FirstName, LastName
    HAVING COUNT(*) > 1  -- 只保留有重复记录的用户组
) AS grouped 
ON t.FirstName = grouped.FirstName 
AND t.LastName = grouped.LastName 
AND t.Number = grouped.max_num;

逻辑说明:子查询先按姓名分组,筛选出每组的最大Number,同时通过HAVING COUNT(*) > 1过滤掉只有单条记录的用户;再通过内连接匹配原表中对应的数据行,得到最终结果。

方法二:适用于MySQL 8.0+(使用窗口函数)

如果你的MySQL版本是8.0及以上,用窗口函数的写法更简洁直观:

WITH ranked_records AS (
    SELECT 
        FirstName, 
        LastName, 
        Number,
        -- 按姓名分组,Number降序排名,每组第一条就是最大Number的记录
        ROW_NUMBER() OVER (PARTITION BY FirstName, LastName ORDER BY Number DESC) AS rn,
        -- 统计每组的记录总数
        COUNT(*) OVER (PARTITION BY FirstName, LastName) AS record_count
    FROM your_table
)
SELECT FirstName, LastName, Number
FROM ranked_records
WHERE rn = 1 AND record_count > 1;

逻辑说明:先用ROW_NUMBER()给每组记录按Number降序排号,用COUNT()统计每组的记录数;最后筛选出排名第一(即Number最大)且组内记录数大于1的行。

内容的提问来源于stack exchange,提问作者Dmytro

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 14:12:15