Mysql取分組後前N個值

2021-08-08 07:13:15 字數 2350 閱讀 9236

表結構如下:

create table `test_group_limit` (

`row_id` varchar (33),

`id` int (11),

`num` bigint (11),

`log` varchar (33)

); insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('1','1','32','e');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('2','1','21','r');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('3','1','54','f');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('4','1','31','d');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('5','1','54','g');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('6','2','32','v');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('7','2','12','b');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('8','2','21','x');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('9','2','76','n');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('10','2','45','z');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('11','2','89','a');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('12','3','32','m');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('13','3','12','k');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('14','3','76','p');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('15','3','45','i');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('16','3','90','l');

insert into `test_group_limit` (`row_id`, `id`, `num`, `log`) values('17','3','65','q');

取按id分組後每組的最大值:

select t1.`id`,t1.`num` from `test_group_limit` t1

where not exists(select 1 from test_group_limit where t1.`id`=id and num>t1.`num`);

上面表示,通過id自關聯,每組中,沒有其他數能大於它的就是最大數,不能大於等於,因為兩組肯定至少存在等於的情況,就查不出來資料。

取按id分組後每組的前三的值

這種方法存在問題,當存在相同值時,前三取出來的資料不一定就是只有三行

select t1.`id`,t1.`num` from `test_group_limit` t1

where 3>(select count(1) from test_group_limit where t1.`id`=id and num>t1.`num`)

order by t1.id asc,t1.num desc

分組後取前N條

這種題目面試中經常出現,記錄一下 首先建表 create table students id int 11 not null auto increment comment 學號 clss id varchar 2 default null comment 班級id stu name varchar ...

MySQL 分組後取前幾條

利用group concat和substring index實現,能很好的利用索引,適合大資料。select from yourtable where id in select substring index group concat id order by column 2 desc 1 id f...

MySQL 分組後取最新值

1.需求 一張表中有多組資料,要求取出每組的最新一條的某些字段值。例如,成績表中儲存了學校所有學生 一年級 二年級 三年級 所有學科 語文 數學 英語 的成績,要求取出某個學生的最近一次所有學科的成績。2.實現 select 學科,select 成績from 成績表where 學科 a.學科 and...