`

mysql 分组之后取出每组的前几条数据

 
阅读更多

转载至:http://www.cnblogs.com/JulyZhang/archive/2011/02/12/1952213.html

 

--按某一字段分组取最大(小)值所在行的数据


/*

数据如下:

name val memo

a    2   a2(a的第二个值)

a    1   a1--a的第一个值

a    3   a3:a的第三个值

b    1   b1--b的第一个值

b    3   b3:b的第三个值

b    2   b2b2b2b2

b    4   b4b4

b    5   b5b5b5b5b5

*/

 

--创建表并插入数据:

 

create table tb(name varchar(10),val int,memo varchar(20))

insert into tb values('a',    2,   'a2(a的第二个值)')

insert into tb values('a',    1,   'a1--a的第一个值')

insert into tb values('a',    3,   'a3:a的第三个值')

insert into tb values('b',    1,   'b1--b的第一个值')

insert into tb values('b',    3,   'b3:b的第三个值')

insert into tb values('b',    2,   'b2b2b2b2')

insert into tb values('b',    4,   'b4b4')

insert into tb values('b',    5,   'b5b5b5b5b5')go

 

--一、按name分组取val最大的值所在行的数据。

 

--方法1:

select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name

--方法2:

select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val)

--方法3:

select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name

--方法4:

select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name

--方法5

select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name

/*

name       val         memo                

---------- ----------- --------------------

a          3           a3:a的第三个值

b          5           b5b5b5b5b5

*/

 

--二、按name分组取val最小的值所在行的数据。

 

--方法1:

select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name

--方法2:

select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val)

--方法3:

select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name

--方法4:

select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name

--方法5

select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name

/*

name       val         memo                

---------- ----------- --------------------

a          1           a1--a的第一个值

b          1           b1--b的第一个值

*/

 

 

--三、按name分组取第一次出现的行所在的数据。

 

select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name

/*

name       val         memo                

---------- ----------- --------------------

a          2           a2(a的第二个值)

b          1           b1--b的第一个值

*/

 

--四、按name分组随机取一条数据。

 

select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name

/*

name       val         memo                

---------- ----------- --------------------

a          1           a1--a的第一个值

b          5           b5b5b5b5b5

*/

 

--五、按name分组取最小的两个(N个)val

 

select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.val

select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val

select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by a.name

/*

name       val         memo                

---------- ----------- --------------------

a          1           a1--a的第一个值

a          2           a2(a的第二个值)

b          1           b1--b的第一个值

b          2           b2b2b2b2

*/

 

--六、按name分组取最大的两个(N个)val

 

select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val

select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val

select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name

/*

name       val         memo                

---------- ----------- --------------------

a          2           a2(a的第二个值)

a          3           a3:a的第三个值

b          4           b4b4

b          5           b5b5b5b5b5

*/

 

--七,假如整行数据有重复,所有的列都相同。

 

/*

数据如下:

name val memo

a    2   a2(a的第二个值)

a    1   a1--a的第一个值

a    1   a1--a的第一个值

a    3   a3:a的第三个值

a    3   a3:a的第三个值

b    1   b1--b的第一个值

b    3   b3:b的第三个值

b    2   b2b2b2b2

b    4   b4b4

b    5   b5b5b5b5b5

*/

 

 

 

 

--在sql server 2000中只能用一个临时表来解决,生成一个自增列,先对val取最大或最小,然后再通过自增列来取数据。

--创建表并插入数据:

 

create table tb(name varchar(10),val int,memo varchar(20))

insert into tb values('a',    2,   'a2(a的第二个值)')

insert into tb values('a',    1,   'a1--a的第一个值')

insert into tb values('a',    1,   'a1--a的第一个值')

insert into tb values('a',    3,   'a3:a的第三个值')

insert into tb values('a',    3,   'a3:a的第三个值')

insert into tb values('b',    1,   'b1--b的第一个值')

insert into tb values('b',    3,   'b3:b的第三个值')

insert into tb values('b',    2,   'b2b2b2b2')

insert into tb values('b',    4,   'b4b4')

insert into tb values('b',    5,   'b5b5b5b5b5')

go

select * , px = identity(int,1,1) into tmp from tb

select m.name,m.val,m.memo from

(

select t.* from tmp t where val = (select min(val) from tmp where name = t.name)

) m where px = (select min(px) from

(

select t.* from tmp t where val = (select min(val) from tmp where name = t.name)

) n where n.name = m.name)

drop table tb,tmp

/*

name       val         memo

---------- ----------- --------------------

a          1           a1--a的第一个值

b          1           b1--b的第一个值

(2 行受影响)

*/

 

--在sql server 2005中可以使用row_number函数,不需要使用临时表。

--创建表并插入数据:

 

create table tb(name varchar(10),val int,memo varchar(20))

insert into tb values('a',    2,   'a2(a的第二个值)')

insert into tb values('a',    1,   'a1--a的第一个值')

insert into tb values('a',    1,   'a1--a的第一个值')

insert into tb values('a',    3,   'a3:a的第三个值')

insert into tb values('a',    3,   'a3:a的第三个值')

insert into tb values('b',    1,   'b1--b的第一个值')

insert into tb values('b',    3,   'b3:b的第三个值')

insert into tb values('b',    2,   'b2b2b2b2')

insert into tb values('b',    4,   'b4b4')

insert into tb values('b',    5,   'b5b5b5b5b5')

go

select m.name,m.val,m.memo from

(

select * , px = row_number() over(order by name , val) from tb

) m where px = (select min(px) from

(

select * , px = row_number() over(order by name , val) from tb

) n where n.name = m.name)

drop table tb

/*

name       val         memo

---------- ----------- --------------------

a          1           a1--a的第一个值

b          1           b1--b的第一个值

(2 行受影响)

*/

分享到:
评论

相关推荐

    mysql分组取每组前几条记录(排名) 附group by与order by的研究

    –按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: nameval memo a 2 a2(a的第二个值) a 1 a1–a的第一个值 a 3 a3:a的第三个值 b 1 b1–b的第一个值 b 3 b3:b的第三个值 b 2 b2b2b2b2 b 4 b4b4 b ...

    MySql分组后随机获取每组一条数据的操作

    在MySQL数据库中,有时我们需要对数据进行分组处理,并从每个分组中随机选取一条记录。这在统计分析或者抽样调查等场景中非常常见。本文将详细介绍如何在MySQL中实现这一操作,以及一些关于随机选取数据的优化方法。...

    MySql基本查询、连接查询、子查询、正则表达查询讲解

    having 子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having 条件显示特定的组,也可以使用多个分组标准进行分组。 having 子句被限制子已经在SELECT语句中定义的列和聚合...

    SQL高级用法

    接着,我们根据`time`对这些记录进行分组,并计算每组中“胜”和“负”的数量。 ##### 2. 在HAVING子句中使用子查询 HAVING子句可以用于过滤GROUP BY操作后的结果集。当我们需要根据某个特定条件来筛选分组后的...

    2021-2022计算机二级等级考试试题及答案No.1340.docx

    根据给定文件的信息,我们可以总结出以下几个重要的知识点: ### 1. VFP系统中的查询文件扩展名 **知识点概述:** VFP(Visual FoxPro)系统中的查询文件是指包含了一条SELECT-SQL命令的程序文件,用于执行数据库...

    python操作ffmpeg对摄像头rtsp流进行自动转码-.pdf

    3. 遍历每一条信息,判断服务器能否 ping 通摄像头地址,如果不通就继续遍历,如果通就去执行转码操作,依次直至遍历完所有摄像头。 具体实施 -------- ### 运行环境 * 操作系统:CentOS Linux release 7.7.1908 ...

    2021-2022计算机二级等级考试试题及答案No.19421.docx

    - 在关系数据库中,每张表都必须满足一定的规则,以确保数据的一致性和完整性。 - **数据项不可再分**(A)是基本要求之一,确保了数据的原子性。 - **同一列数据项要具有相同的数据类型**(B)也是必要的,这有助于...

    JAVA上百实例源码以及开源项目源代码

    Java 组播组中发送和接受数据实例 3个目标文件。 Java读写文本文件的示例代码 1个目标文件。 java俄罗斯方块 一个目标文件。 Java非对称加密源码实例 1个目标文件 摘要:Java源码,算法相关,非对称加密 Java非对称...

    editplus 代码编辑器html c++ jsp css

    右键单击文档标签工具条,弹出菜单中选择“标签选项”,选中“用鼠标中间的按钮关闭”,这里包括鼠标的滚轮。 【8】软件技巧——如何去掉 EditPlus 保存文本文件时的添加后缀提示? 如果你使用 EditPlus 进行文本...

    EditPlus 2整理信箱的工具

    右键单击文档标签工具条,弹出菜单中选择“标签选项”,选中“用鼠标中间的按钮关闭”,这里包括鼠标的滚轮。 【8】软件技巧——如何去掉 EditPlus 保存文本文件时的添加后缀提示? 如果你使用 EditPlus 进行文本...

    Editplus 3[1].0

    右键单击文档标签工具条,弹出菜单中选择“标签选项”,选中“用鼠标中间的按钮关闭”,这里包括鼠标的滚轮。 【8】软件技巧——如何去掉 EditPlus 保存文本文件时的添加后缀提示? 如果你使用 EditPlus 进行文本...

Global site tag (gtag.js) - Google Analytics