`

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分组取每组前几条记录(排名) 附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分组后随机获取每组一条数据的操作

    2. 将随机排序后的数据按班级分组: ```sql GROUP BY a.class ``` 组合起来,完整的SQL查询语句如下: ```sql SELECT * FROM ( SELECT * FROM xdx_test ORDER BY RAND() ) a GROUP BY a.class ``` 执行这个...

    基于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常用sql语句(本人整理而出)

    本文将对常用的MySQL SQL语句进行详细的解析。 1. 查看数据库命令:show databases show databases命令的功能是列出数据库服务器上所有的数据库。这个命令常用于查看当前服务器上的所有数据库。 关键字:show 2....

    MySQL DBA高频面试题

    - 删除了最后两条数据后,重启MySQL,插入一条数据后id值会接着上次的最大值。 6. 各类连接区别: - 内连接(INNER JOIN)返回两个表中匹配的行。 - 左连接(LEFT JOIN)返回左表所有行,即使右表没有匹配。 - ...

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

    在MySQL数据库中,经常遇到需要处理以逗号分隔的字段值的情况,这些字段通常用于存储多值数据,比如在本例中,`related_shop_ids`字段存储了多个商店ID,用逗号分隔。本篇文章将详细讲解如何将这样的字段拆分成多个...

    mysql索引与视图的实例附答案.docx

    索引的缺点是创建和维护索引需要耗费时间,耗费时间的数量随着数据量的增加而增加;索引需要占用物理空间,每一个索引要占一定的物理空间;增加、删除和修改数据时,需要动态的维护索引,造成数据的维护速度降低了。...

    MySQL分区和分表技术总结.docx

    * update 操作:当更新一条数据时,分区层先打开并锁住所有的底层表,mysql 先确定需要更新的记录在哪个分区,然后取出数据并更新,再判断更新后的数据应该放在哪个分区,然后对底层表进行写入操作,并对原数据所在...

    sql_按照某一个字段进行去重后获取全部字段

    - **GROUP BY 语句**:与聚合函数(如 COUNT, SUM, AVG 等)结合使用,可以对分组后的数据进行统计分析。 - **窗口函数**:如 ROW_NUMBER(), RANK() 和 DENSE_RANK() 等,这些函数可以帮助我们在查询结果中确定每行...

    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 ...

    Spark SQL编程初级实践-答案-实验报告-纠正版

    - **写入数据**:使用DataFrame将新数据写入MySQL数据库中的`employee`表。 - **查询结果**:查询并打印`age`的最大值和总和。 #### 三、实验代码示例 ```scala import org.apache.spark.sql.SparkSession val ...

    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文件 ...

    MySQL 存储过程和&quot;Cursor&quot;的使用方法

    MySQL存储过程是数据库中一种非常实用的特性,它允许用户定义一组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...

    简单了解MySQL SELECT执行顺序

    MySQL的SELECT语句是数据库查询的核心,用于从数据表中检索特定信息。了解其执行顺序对于优化查询性能至关重要。在MySQL中,SELECT语句的执行流程可以分解为10个步骤,每个步骤都有其特定的功能,并产生一个中间的...

    sql模拟面试题.

    通过`LEFT OUTER JOIN`将学生表和成绩表连接起来,然后`GROUP BY`按学号和姓名分组,使用`SUM()`函数计算总成绩,最后使用`TOP`或`LIMIT`(根据数据库系统)来限制结果集的大小,取出前三个记录。 ```sql -- 对于...

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

    10. `COPYTO`命令常用于将数据库中的数据保存到二维数组中。 11. 软件维护不仅包括修复错误,还包括功能增强和适应性维护等。 12. C语言程序由一个或多个函数组成,没有主程序和子程序的概念。 13. Java程序中,...

Global site tag (gtag.js) - Google Analytics