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
相关推荐
–按某一字段分组取最大(小)值所在行的数据 代码如下: /* 数据如下: 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 ...
2. 将随机排序后的数据按班级分组: ```sql GROUP BY a.class ``` 组合起来,完整的SQL查询语句如下: ```sql SELECT * FROM ( SELECT * FROM xdx_test ORDER BY RAND() ) a GROUP BY a.class ``` 执行这个...
前言: group by函数后取到的是分组中的第一条数据,但是我们有时候需要取出各分组的最新一条,该怎么实现呢? 本文提供两种实现方式。 一、准备数据 ... 二、三种实现方式 1)先order by之后再分组: ...
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语句进行详细的解析。 1. 查看数据库命令:show databases show databases命令的功能是列出数据库服务器上所有的数据库。这个命令常用于查看当前服务器上的所有数据库。 关键字:show 2....
- 删除了最后两条数据后,重启MySQL,插入一条数据后id值会接着上次的最大值。 6. 各类连接区别: - 内连接(INNER JOIN)返回两个表中匹配的行。 - 左连接(LEFT JOIN)返回左表所有行,即使右表没有匹配。 - ...
在MySQL数据库中,经常遇到需要处理以逗号分隔的字段值的情况,这些字段通常用于存储多值数据,比如在本例中,`related_shop_ids`字段存储了多个商店ID,用逗号分隔。本篇文章将详细讲解如何将这样的字段拆分成多个...
索引的缺点是创建和维护索引需要耗费时间,耗费时间的数量随着数据量的增加而增加;索引需要占用物理空间,每一个索引要占一定的物理空间;增加、删除和修改数据时,需要动态的维护索引,造成数据的维护速度降低了。...
* update 操作:当更新一条数据时,分区层先打开并锁住所有的底层表,mysql 先确定需要更新的记录在哪个分区,然后取出数据并更新,再判断更新后的数据应该放在哪个分区,然后对底层表进行写入操作,并对原数据所在...
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中,可以使用SELECT语句来查询数据。根据查询条件的不同,数据库系统会找到不同的数据。 SELECT语句的基本语法格式如下: [sql] view plain copy ...
在MySQL中,`GROUP BY` 语句用于对数据进行分组,通常与聚合函数(如 COUNT(), SUM(), AVG() 等)一起使用,以便对每个分组进行计算。然而,有时候我们可能需要在每个分组中选取特定的一条记录,例如分组内最早或最...
- **写入数据**:使用DataFrame将新数据写入MySQL数据库中的`employee`表。 - **查询结果**:查询并打印`age`的最大值和总和。 #### 三、实验代码示例 ```scala import org.apache.spark.sql.SparkSession val ...
实例244 将文本文件中数据存储到数据库中 316 4.5 文件的压缩与解压 318 实例245 PHP中压缩RAR文件 319 实例246 PHP中将上传文件转换成RAR文件 320 实例247 PHP中对RAR文件进行解压 321 实例248 PHP中压缩ZIP文件 ...
实例244 将文本文件中数据存储到数据库中 316 4.5 文件的压缩与解压 318 实例245 PHP中压缩RAR文件 319 实例246 PHP中将上传文件转换成RAR文件 320 实例247 PHP中对RAR文件进行解压 321 实例248 PHP中压缩ZIP文件 ...
MySQL存储过程是数据库中一种非常实用的特性,它允许用户定义一组SQL语句,并将其作为一个单元来执行。这种集合操作可以提高效率,减少网络通信,同时使得代码更加模块化和可重复使用。在处理复杂的业务逻辑或需要...
下面两个函数的使用和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语句的执行流程可以分解为10个步骤,每个步骤都有其特定的功能,并产生一个中间的...
通过`LEFT OUTER JOIN`将学生表和成绩表连接起来,然后`GROUP BY`按学号和姓名分组,使用`SUM()`函数计算总成绩,最后使用`TOP`或`LIMIT`(根据数据库系统)来限制结果集的大小,取出前三个记录。 ```sql -- 对于...