如何用SQL按分组获取每组第一条记录?现有查询问题排查
问题1:修正
tailors表按cat_id分组取每组第一条记录的SQL 你原来的SQL返回所有记录,是因为子查询的GROUP BY里多包含了id、name、status这些字段——这些字段每行都不同,导致每一行都被当成独立分组,min(id)就是当前行的id,所以外层查询会匹配所有行。
修正后的SQL:
SELECT * FROM tailors WHERE id IN( SELECT min(id) FROM tailors GROUP BY cat_id )
只保留cat_id作为分组字段,就能得到每个分类下的最小id,进而取出每组的第一条记录。
问题2:通用场景——获取每个
group_id对应value最小的行 假设你的表结构包含group_id、value、name等字段,这里提供两种常用方法:
方法1:窗口函数(适合MySQL 8+、PostgreSQL、SQL Server等现代数据库)
SELECT t.* FROM ( SELECT *, ROW_NUMBER() OVER (PARTITION BY group_id ORDER BY value ASC) AS rn FROM your_table ) t WHERE t.rn = 1;
PARTITION BY group_id:按group_id分组ORDER BY value ASC:让每组内value最小的行排在第一位(标记为rn=1)- 外层筛选
rn=1的行,就是每个组里value最小的行。如果同一个组有多个行value相同且都是最小值,可在ORDER BY后加额外字段(比如id)来确定唯一行。
方法2:关联子查询(兼容旧版本MySQL)
SELECT t1.* FROM your_table t1 WHERE t1.value = ( SELECT MIN(value) FROM your_table t2 WHERE t2.group_id = t1.group_id );
子查询先找到当前group_id对应的最小value,外层再取出该组内value等于这个最小值的所有行。如果允许同一组多个最小value的行存在,这个方法更合适。
内容的提问来源于stack exchange,提问作者Abdallah
相关产品推荐
相关产品推荐

