`

Mysql将数据分组后取出时间最近的数据

阅读更多

select * from AccountMark as b where not exists(select 1 from AccountMark where AccountId= b.AccountId
and b.CreateTime<CreateTime )

谢谢这位大神的解答,这样查出来的数据是正确的而且避免了查询子句的问题。但是如果我要在这里面统计出每一个AccountId有多少条Mark(最后一张截图里面的Num)该怎么写呢

select *,(select count(distinct mark) from AccountMark where AccountId= b.AccountId)
 from AccountMark as b where not exists(select 1 from AccountMark where AccountId= b.AccountId
 and b.CreateTime<CreateTime )

下面有两种方法:假设你的表叫t_biz_sign ,'最新列'字段叫create_time ,需要分组的字段叫foreign_id 

SELECT sign.*
FROM t_biz_sign sign
WHERE NOT exists(SELECT 1
                 FROM t_biz_sign
                 WHERE foreign_id = sign.foreign_id
                       AND sign.create_time < create_time)
ORDER BY create_time DESC;


SELECT *
FROM t_biz_sign sign
WHERE (SELECT count(*)
       FROM t_biz_sign AS m
       WHERE m.foreign_id = sign.foreign_id AND m.create_time >= sign.create_time) < 2;

参考下贴中的多种方法

http://blog.csdn.net/acmain_chm/article/details/4126306
[征集]分组取最大N条记录方法征集,及散分....

 

经常看到问题,如何取出每组的前N条记录。方便大家参考于是便把常见的几种解法列出于下。

问题:有表 如下,要求取出各班前两名(允许并列第二)
Table1
+----+------+------+-----+
| id |SName |ClsNo |Score|
+----+------+------+-----+
|  1 |AAAA  |  C1  | 67  |
|  2 |BBBB  |  C1  | 55  |
|  3 |CCCC  |  C1  | 67  |
|  4 |DDDD  |  C1  | 65  |
|  5 |EEEE  |  C1  | 95  |
|  6 |FFFF  |  C2  | 57  |
|  7 |GGGG  |  C2  | 87  |
|  8 |HHHH  |  C2  | 74  |
|  9 |IIII  |  C2  | 52  |
| 10 |JJJJ  |  C2  | 81  |
| 11 |KKKK  |  C2  | 67  |
| 12 |LLLL  |  C2  | 66  |
| 13 |MMMM  |  C2  | 63  |
| 14 |NNNN  |  C3  | 99  |
| 15 |OOOO  |  C3  | 50  |
| 16 |PPPP  |  C3  | 59  |
| 17 |QQQQ  |  C3  | 66  |
| 18 |RRRR  |  C3  | 76  |
| 19 |SSSS  |  C3  | 50  |
| 20 |TTTT  |  C3  | 50  |
| 21 |UUUU  |  C3  | 64  |
| 22 |VVVV  |  C3  | 74  |
+----+------+------+-----+

结果如下
+----+------+------+-----+
| id |SName |ClsNo |Score|
+----+------+------+-----+
|  5 |EEEE  |  C1  | 95  |
|  1 |AAAA  |  C1  | 67  |
|  3 |CCCC  |  C1  | 67  |
|  7 |GGGG  |  C2  | 87  |
| 10 |JJJJ  |  C2  | 81  |
| 14 |NNNN  |  C3  | 99  |
| 18 |RRRR  |  C3  | 76  |
+----+------+------+-----+

 

方法一:
select a.id,a.SName,a.ClsNo,a.Score
from Table1 a left join Table1 b on a.ClsNo=b.ClsNo and a.Score<b.Score
group by a.id,a.SName,a.ClsNo,a.Score
having count(b.id)<2
order by a.ClsNo,a.Score desc

 

方法二:

 

select *
from Table1 a
where 2>(select count(*) from Table1 where ClsNo=a.ClsNo and Score>a.Score)
order by a.ClsNo,a.Score desc

 

 

 

方法三:
select *
from Table1 a
where id in (select id from Table1 where ClsNo=a.ClsNo order by Score desc limit 2)
order by a.ClsNo,a.Score desc

 

 

 

方法....

这里列出了多种SQL语句的实现方法,有些是MySQL特有的(Limit, 其它数据库可根据实际更改,比如Oracle的rownum,MS SQL SERVER 的 top,..),有时是SQL标准支持的。但效率上和应用的场合或许不同。具体应用时可根据实际表中的记录情况,索引情况进行选择。

 

 

 

 

 

特例 N=1 ,即取最大的/最小的一条记录。
+----+------+------+-----+
| id |SName |ClsNo |Score|
+----+------+------+-----+
|  5 |EEEE  |  C1  | 95  |
|  7 |GGGG  |  C2  | 87  |
| 14 |NNNN  |  C3  | 99  |
+----+------+------+-----+

 

 

 

select *
from Table1 a
where not exists (select 1 from Table1 where ClsNo=a.ClsNo and Score>a.Score);

 

 

 

 

 

select a.*
from Table1 a inner join (select ClsNo, max(Score) as mScore from Table1 group by ClsNo) b
 on a.ClsNo=b.ClsNo and a.Score=b.Score

 


select *
from (select * from Table1 order by Score desc) t
group by ClsNo

 

本文来源于:http://bbs.csdn.net/topics/390958705

分享到:
评论

相关推荐

    Mysql取分组后的每组第一条数据

    gruop by 分组后 进行 order by mysql会按照 先分组后排序的形式进行输出 并不能做到每组中的第一条数据取出。 我的思路是 : 先将要查询的数据表转换成已经排序的临时表 在进行 分组操作 。 因为在mysql分组是将第...

    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分组后随机获取每组一条数据的操作

    思路:先随机排序然后再分组就好了。 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实现group by取各分组最新一条数据

    前言: group by函数后取到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢? 本文提供两种实现方式。 一、准备数据 ... 二、三种实现方式 1)先order by之后再分组: ...

    MYSQL培训经典教程(共两部分) 1/2

    4 1.1.5总结 5 1.2 关系数据库管理系统 5 1.2.1 关系数据库...MYSQL数据处理 10 1.4.1 MySQL的数据 10 1.4.1.1、字符串值 10 1.4.1.2数字值 11 1.4.1.3十六进制值 12 1.4.1.4日期和时间值 ...

    MySQL将一个字段中以逗号分隔的取出来形成新的字段实现

    1例如:要把如图1的字段拆分图2 select account_id, substring_index(substring_... mysql.help_topic b on b.help_topic_id &lt; (length(a.related_shop_ids) - length(replace(a.related_shop_ids,',',''))+1

    MYSQL培训经典教程(共两部分) 2/2

    4 1.1.5总结 5 1.2 关系数据库管理系统 5 1.2.1 关系数据库...MYSQL数据处理 10 1.4.1 MySQL的数据 10 1.4.1.1、字符串值 10 1.4.1.2数字值 11 1.4.1.3十六进制值 12 1.4.1.4日期和时间值 ...

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

    查询数据是指从数据库中的数据表或视图中获取所需要的数据,在mysql中,可以使用SELECT语句来查询数据。根据查询条件的不同,数据库系统会找到不同的数据。 SELECT语句的基本语法格式如下: [sql] view plain copy ...

    数据库MySQL基础知识点3

    day11: where条件之比较运算、逻辑运算 模糊查询(like) % 表示任意多个字符 _ 表示一个任意字符 范围查询(between and 、in) ... 限制记录limit:限制取出记录的数量,要写在SQL语句的最后 标准的SQL书写格式

    MySql逗号拼接字符串查询的两种方法

    下面两个函数的使用和FIND_IN_SET一样,使用时只需要把FIND_IN_SET换成FIND_PART_IN_SET或FIND_ALL_PART_IN_SET 例如某字段里是为1,2,3,4,5  使用方法: 第一种,传入1,3,6 可以查出来 select * from XXX where FIND...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part1

    实例244 将文本文件中数据存储到数据库中 316 4.5 文件的压缩与解压 318 实例245 PHP中压缩RAR文件 319 实例246 PHP中将上传文件转换成RAR文件 320 实例247 PHP中对RAR文件进行解压 321 实例248 PHP中压缩ZIP文件 ...

    PHP开发实战1200例(第1卷).(清华出版.潘凯华.刘中华).part2

    实例244 将文本文件中数据存储到数据库中 316 4.5 文件的压缩与解压 318 实例245 PHP中压缩RAR文件 319 实例246 PHP中将上传文件转换成RAR文件 320 实例247 PHP中对RAR文件进行解压 321 实例248 PHP中压缩ZIP文件 ...

    易语言程序免安装版下载

     静态编译后的易语言EXE/DLL之间不能再共享譬如窗口、窗口组件等类似资源,对于已经静态连接到一个EXE/DLL中的支持库,该支持库中的数据或资源将不能再被其它EXE/DLL中所使用的同名支持库访问。这是因为代码被分别...

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

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

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

     关于数字签名:产生RSA密钥对(myKeyPair),得到RSA密钥对,产生Signature对象,对用私钥对信息(info)签名,用指定算法产生签名对象,用私钥初始化签名对象,将待签名的数据传送给签名对象(须在初始化之后),用公钥...

    Zebra-PHP-ArrayGroupBy.zip

    为什么使用Zebra-PHP-ArrayGroupBy在如下场景中,我们总是希望能够在php中使用类似mysql的groupby操作:SQL过于复杂,造成数据库运算效率低下从数据库中读取出原始数据,在php中进行运算,增强代码重用率其他非...

Global site tag (gtag.js) - Google Analytics