从含重复记录的表中提取每组重复记录的前两条
按分组保留每组前两条记录的SQL实现
需求概述
原表包含Name和Country字段,部分国家(如India、Russia、England)存在多条重复记录,需提取数据时,每个Country分组仅保留前两条对应记录。
各主流数据库实现方案
MySQL/MariaDB
借助ROW_NUMBER()窗口函数,按Country分组后排序(默认按数据存储顺序,可按需指定排序字段):
SELECT Name, Country FROM ( SELECT Name, Country, ROW_NUMBER() OVER (PARTITION BY Country ORDER BY NULL) AS row_num FROM your_table_name ) AS ranked WHERE row_num <= 2;
注:若需要按特定字段(如
Name)排序,可将ORDER BY NULL替换为ORDER BY Name ASC/DESC。
PostgreSQL
使用窗口函数实现,推荐用主键保证排序稳定性:
SELECT Name, Country FROM ( SELECT Name, Country, ROW_NUMBER() OVER (PARTITION BY Country ORDER BY id) AS row_num FROM your_table_name ) AS ranked WHERE row_num <= 2;
这里假设id是表的自增主键,确保每次查询结果的一致性。
SQL Server
窗口函数实现,可自定义排序依据:
SELECT Name, Country FROM ( SELECT Name, Country, ROW_NUMBER() OVER (PARTITION BY Country ORDER BY create_time) AS row_num FROM your_table_name ) AS ranked WHERE row_num <= 2;
将create_time替换为实际需要的排序字段即可。
Oracle
利用分析函数实现:
SELECT Name, Country FROM ( SELECT Name, Country, ROW_NUMBER() OVER (PARTITION BY Country ORDER BY rowid) AS row_num FROM your_table_name ) WHERE row_num <= 2;
rowid代表记录的物理存储位置,作为默认排序依据。
核心逻辑说明
PARTITION BY Country:指定按国家字段分组ROW_NUMBER():为每组内的记录分配唯一递增序号WHERE row_num <=2:筛选出每组的前两条记录
内容的提问来源于stack exchange,提问作者Pallavi Singh
相关产品推荐
相关产品推荐

