`

[转] 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实现分组取n条最大记录.txt

    在MySQL中实现分组并获取每组...这种方法不仅适用于上述具体场景,还可以扩展应用于其他类似的需求,例如按不同标准分组并选取每组中的前几条记录等。掌握这些技巧将有助于提高数据库操作效率,更好地管理和分析数据。

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

    总结来说,MySQL中的GROUP BY分组功能不仅限于简单的聚合计算,还可以配合其他查询语句,如JOIN、HAVING和子查询,实现更复杂的查询需求,如获取每个分组的前N条记录。在处理这类问题时,理解并熟练运用这些技巧将有...

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

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

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

    在MySQL数据库中,获取每个分类的前N条记录是一个常见的查询需求,特别是在处理如文章、商品、用户等分组信息时。以下将详细介绍如何通过SQL语句实现这一功能,并给出三个示例。 首先,我们需要理解基本的SQL语法,...

    Mysql查询最近一条记录的sql语句(优化篇)

    首先,对数据进行排序,然后按用户ID分组,返回每个组的第一条记录: ```sql SELECT * FROM (SELECT * FROM a WHERE create_time ) t GROUP BY user_id; ``` 这种方法虽然减少了不必要的排序,但仍然需要进行两次...

    mysql合并多条记录的单个字段去一条记录编辑

    在MySQL中,有时候我们需要将一个表中多条记录的单个字段值合并成一条记录,以便于数据分析或者简化展示。这种需求通常出现在我们想要聚合某些特定字段的数据时。本篇文章将详细讲解两种方法来实现这一目标,以示例...

    MySQL 查询某个字段不重复的所有记录

    这是正确的做法,因为每组中最小的`id`通常是第一条记录。对应的SQL语句如下: ```sql SELECT a.* FROM book a RIGHT JOIN ( SELECT MIN(id) id FROM book GROUP BY title ) b ON b.id = a.id WHERE a.id ...

    MySql培训日志_stu

    - 表是数据库中用来存储数据的基本单元,由行和列组成,每行代表一条记录,每列代表一种属性。 - **1.1.6 SQL的分类** - SQL可以分为DDL(Data Definition Language,数据定义语言)、DML(Data Manipulation ...

    MySQL命令大全

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

    MySQL单表查询操作实例详解【语法、约束、分组、聚合、过滤、排序等】

    7. `LIMIT`:限制返回的记录数量,用于获取查询结果的前几条记录。 执行顺序是这样的:首先,`FROM`关键字确定了数据来源;然后,`WHERE`用来筛选满足条件的记录;接着,`GROUP BY`进行分组;`HAVING`对分组后的...

    mysql面试题

    第二个问题是随机选取表中的5条记录。这可以通过结合`ORDER BY RAND()`和`LIMIT`子句实现。不过,每次运行这个查询,由于`RAND()`函数会生成不同的随机数,所以结果会有所不同。示例如下: ```sql SELECT * FROM ...

    mysql查询优化的若干

    在输出每条记录之前,MySQL会检查是否符合HAVING子句的条件,不符合条件的记录会被跳过。 以上总结了MySQL查询优化的一些关键知识点,包括LEFT JOIN的优化策略、常数表达式的处理、WHERE与HAVING子句的优化、常数表...

    2021春招MySQL高频面试题.pdf

    ### 数据库知识(通用)篇 #### 1. 说说主键、外键、超键、候选键 - **超键**:在关系数据库中能够唯一标识一个元组... 请使用脚本查询一条数据:插入一条数据“1,oldboy” 脚本如下: ```sql INSERT INTO test (id,...

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

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

    高级软件人才培训专家-day07-数据库-MySQL(2)

    - **开始位置**: 指定从第几条记录开始返回。 - **结束位置**: 指定总共返回多少条记录。 **示例**: ```sql SELECT * FROM tb_emp LIMIT 10, 5; ``` ### 总结 以上就是本次培训中关于 MySQL 数据库中 DQL 语句的...

    MYSQL,SQLSERVER,ORACLE常用的函数

    根据提供的标题和描述,本文将详细介绍在MySQL、SQL Server以及Oracle数据库中常用的函数。这些函数主要分为几大类:字符串处理函数、数值处理函数、日期处理函数、转换函数以及其他一些特殊用途的函数。 ### 字符...

Global site tag (gtag.js) - Google Analytics