`

[转] mysql分组取每组前几条记录

 
阅读更多

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

复制代码
/*
数据如下:
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
*/
复制代码

--创建表并插入数据:

复制代码
createtable tb(name varchar(10),val int,memo varchar(20))
insertinto tb values('a', 2, 'a2(a的第二个值)')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('b', 1, 'b1--b的第一个值')
insertinto tb values('b', 3, 'b3:b的第三个值')
insertinto tb values('b', 2, 'b2b2b2b2')
insertinto tb values('b', 4, 'b4b4')
insertinto tb values('b', 5, 'b5b5b5b5b5')
go
复制代码

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

复制代码
--方法1:
select a.*from tb a where val = (selectmax(val) from tb where name = a.name) orderby a.name
--方法2:
select a.*from tb a wherenotexists(select1from tb where name = a.name and val > a.val)
--方法3:
select a.*from tb a,(select name,max(val) val from tb groupby name) b where a.name = b.name and a.val = b.val orderby a.name
--方法4:
select a.*from tb a innerjoin (select name , max(val) val from tb groupby name) b on a.name = b.name and a.val = b.val orderby a.name
--方法5
select a.*from tb a where1> (selectcount(*) from tb where name = a.name and val > a.val ) orderby a.name
/*
name val memo
---------- ----------- --------------------
a 3 a3:a的第三个值
b 5 b5b5b5b5b5
*/
复制代码

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

复制代码
--方法1:
select a.*from tb a where val = (selectmin(val) from tb where name = a.name) orderby a.name
--方法2:
select a.*from tb a wherenotexists(select1from tb where name = a.name and val < a.val)
--方法3:
select a.*from tb a,(select name,min(val) val from tb groupby name) b where a.name = b.name and a.val = b.val orderby a.name
--方法4:
select a.*from tb a innerjoin (select name , min(val) val from tb groupby name) b on a.name = b.name and a.val = b.val orderby a.name
--方法5
select a.*from tb a where1> (selectcount(*) from tb where name = a.name and val < a.val) orderby a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值
*/
复制代码

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

复制代码
select a.*from tb a where val = (selecttop1 val from tb where name = a.name) orderby a.name
/*
name val memo
---------- ----------- --------------------
a 2 a2(a的第二个值)
b 1 b1--b的第一个值
*/
复制代码

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

复制代码
select a.*from tb a where val = (selecttop1 val from tb where name = a.name orderbynewid()) orderby a.name
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 5 b5b5b5b5b5
*/
复制代码

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

 

复制代码
select a.*from tb a where2> (selectcount(*) from tb where name = a.name and val < a.val ) orderby a.name,a.val
select a.*from tb a where val in (selecttop2 val from tb where name=a.name orderby val) orderby a.name,a.val
select a.*from tb a whereexists (selectcount(*) from tb where name = a.name and val < a.val havingCount(*) <2) orderby 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 where2> (selectcount(*) from tb where name = a.name and val > a.val ) orderby a.name,a.val
select a.*from tb a where val in (selecttop2 val from tb where name=a.name orderby val desc) orderby a.name,a.val
select a.*from tb a whereexists (selectcount(*) from tb where name = a.name and val > a.val havingCount(*) <2) orderby 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取最大或最小,然后再通过自增列来取数据。

--创建表并插入数据:

 

复制代码
createtable tb(name varchar(10),val int,memo varchar(20))
insertinto tb values('a', 2, 'a2(a的第二个值)')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('b', 1, 'b1--b的第一个值')
insertinto tb values('b', 3, 'b3:b的第三个值')
insertinto tb values('b', 2, 'b2b2b2b2')
insertinto tb values('b', 4, 'b4b4')
insertinto 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 = (selectmin(val) from tmp where name = t.name)
) m
where px = (selectmin(px) from
(
select t.*from tmp t where val = (selectmin(val) from tmp where name = t.name)
) n
where n.name = m.name)
droptable tb,tmp
/*
name val memo
---------- ----------- --------------------
a 1 a1--a的第一个值
b 1 b1--b的第一个值
(2 行受影响)
*/
复制代码

 

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

--创建表并插入数据:

 

复制代码
createtable tb(name varchar(10),val int,memo varchar(20))
insertinto tb values('a', 2, 'a2(a的第二个值)')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 1, 'a1--a的第一个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('a', 3, 'a3:a的第三个值')
insertinto tb values('b', 1, 'b1--b的第一个值')
insertinto tb values('b', 3, 'b3:b的第三个值')
insertinto tb values('b', 2, 'b2b2b2b2')
insertinto tb values('b', 4, 'b4b4')
insertinto tb values('b', 5, 'b5b5b5b5b5')
go
select m.name,m.val,m.memo from
(
select* , px = row_number() over(orderby name , val) from tb
) m
where px = (selectmin(px) from
(
select* , px = row_number() over(orderby name , val) from tb
) n
where n.name = m.name)
droptable 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取分组后的每组第一条数据 gruop by 分组后 进行 order by mysql会按照 先分组后排序的形式进行输出 并不能做到每组中的第一条数据取出。 我的思路是 : 先将要查询的数据表转换成已经排序的临时表 在进行 分组...

    mysql使用GROUP BY分组实现取前N条记录的方法

    主要介绍了mysql使用GROUP BY分组实现取前N条记录的方法,结合实例形式较为详细的分析了mysql中GROUP BY分组的相关使用技巧,需要的朋友可以参考下

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

    思路:先随机排序然后再分组就好了。 1、创建表: CREATE TABLE `xdx_test` ( `id` int(11) NOT NULL, `name` varchar(255) DEFAULT NULL, `class` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=...

    MySQL获取所有分类的前N条记录

    本文给大家分享的是使用mysql实现获取所有分类的前N条记录的方法,本文给出了3个示例,有需要的小伙伴可以参考下。

    MySQL命令大全

    例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为的名为Tom的成绩为.45, 编号为 的名为Joan 的成绩为.99,编号为 的名为Wang 的成绩为.5. mysql&gt;insert into MyClass values(1,’Tom’,96.45),(2,’Joan...

    mysql数据库的基本操作语法

    Ø 常用查询 MySQL结束符是“;”结束。 1、 显示所有数据库 show databases; 2、 删除数据库 drop database dbName; 3、 创建数据库 create database [if not exists] dbName;...可以完成单条记录、多条记录、单表...

    MYSQL常用命令大全

    例如,往表 MyClass中插入二条记录, 这二条记录表示:编号为1的名为Tom的成绩为96.45, 编号为2 的名为Joan 的成绩为82.99,编号为3 的名为Wang 的成绩为96.5. mysql&gt; insert into MyClass values(1,'Tom',96.45),(2,...

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

    不加条件,那么就只取每个分组的第一条。 如果想看分组的内容,可以加groub_concat [sql] view plain copy select STU_SEX,group_concat(STU_NAME) from STUDENT group by STU_SEX; 3.2、一般情况下group需与...

    2009达内SQL学习笔记

    如果想在多个列上进行排序,必须对每个列指定DESC关键字。 升序是默认的,可不写,但降序必须写。 六、WHERE子句,选择、过滤 其后只能跟逻辑语句,返回值只有ture或false 如: select last_name,salary from s...

    常用SQL 语句大全

    14、前10条记录 15、选择每组中的最大数 第三部分、 技巧 1、True/False的使用 2、收缩数据库 3、压缩数据库 dbcc shrinkdatabase(dbname) 4、转移数据库给新用户以已存在用户权限 5、检查备份集 6、修复...

    正式版帝国网站管理系统源码 4.0

    可设置采集前几条记录。 ·采集区域更准确:整体页面区域正则+信息链接区域正则 ·支持页面编码转换:目前支持gb2312、big5、utf-8编码转换 ·效率更高:采用分组采集与入库;支持多线程(节点)采集 ·方便性:采集...

    Java开发实战1200例(第1卷).(清华出版.李钟尉.陈丹丹).part3

    实例054 使用sort方法对数组进行排序 67 实例055 反转数组中元素的顺序 68 3.4 常用集合的使用 69 实例056 用动态数组保存学生姓名 69 实例057 用List集合传递学生信息 70 实例058 用TreeSet生成不重复自动排序 随机...

    Python Cookbook

    5.15 根据姓的首字母将人名排序和分组 214 第6章 面向对象编程 217 引言 217 6.1 温标的转换 223 6.2 定义常量 225 6.3 限制属性的设置 227 6.4 链式字典查询 229 6.5 继承的替代方案-自动托管 231 6.6 在...

Global site tag (gtag.js) - Google Analytics