SQL分组取每组前一(或几)条记录(排名)

转自: https://www.cnblogs.com/netserver/p/4518995.html

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

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


--创建表并插入数据:

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

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

代码如下:
复制代码
--方法1:select a.* from tb a where val = (select max(val) from tb where name = a.name) order by a.name 
--方法2: 
select a.* from tb a where not exists(select 1 from tb where name = a.name and val > a.val) 
--方法3: 
select a.* from tb a,(select name,max(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name 
--方法4: 
select a.* from tb a inner join (select name , max(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name 
--方法5 
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name 
/* 
name val memo 
---------- ----------- -------------------- 
a 3 a3:a的第三个值 
b 5 b5b5b5b5b5 */ 
复制代码

本人推荐使用1,3,4,结果显示1,3,4效率相同,2,5效率差些,不过我3,4效率相同毫无疑问,1就不一样了,想不搞了。


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

代码如下:
复制代码
--方法1:select a.* from tb a where val = (select min(val) from tb where name = a.name) order by a.name 
--方法2: 
select a.* from tb a where not exists(select 1 from tb where name = a.name and val < a.val) 
--方法3: 
select a.* from tb a,(select name,min(val) val from tb group by name) b where a.name = b.name and a.val = b.val order by a.name 
--方法4: 
select a.* from tb a inner join (select name , min(val) val from tb group by name) b on a.name = b.name and a.val = b.val order by a.name 
--方法5 
select a.* from tb a where 1 > (select count(*) from tb where name = a.name and val < a.val) order by a.name 
/* 
name val memo 
---------- ----------- -------------------- 
a 1 a1--a的第一个值 
b 1 b1--b的第一个值 
*/
复制代码

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

代码如下:
复制代码
select a.* from tb a where val = (select top 1 val from tb where name = a.name) order by a.name 
/* 
name val memo 
---------- ----------- -------------------- 
a 2 a2(a的第二个值) 
b 1 b1--b的第一个值 
*/ 
复制代码

 

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

代码如下:
复制代码
select a.* from tb a where val = (select top 1 val from tb where name = a.name order by newid()) order by a.name/* 
name val memo 
---------- ----------- -------------------- 
a 1 a1--a的第一个值 
b 5 b5b5b5b5b5 */ 
复制代码

 

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

代码如下:
复制代码
select a.* from tb a where 2 > (select count(*) from tb where name = a.name and val < a.val ) order by a.name,a.valselect a.* from tb a where val in (select top 2 val from tb where name=a.name order by val) order by a.name,a.val 
select a.* from tb a where exists (select count(*) from tb where name = a.name and val < a.val having Count(*) < 2) order by 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 where 2 > (select count(*) from tb where name = a.name and val > a.val ) order by a.name,a.val 
select a.* from tb a where val in (select top 2 val from tb where name=a.name order by val desc) order by a.name,a.val 
select a.* from tb a where exists (select count(*) from tb where name = a.name and val > a.val having Count(*) < 2) order by a.name 
/* 
name val memo 
---------- ----------- -------------------- 
a 2 a2(a的第二个值) 
a 3 a3:a的第三个值 
b 4 b4b4 
b 5 b5b5b5b5b5 
*/ 
复制代码

 

--七,假如整行数据有重复,所有的列都相同(例如下表中的第5,6两行数据完全相同)。 
按name分组取最大的两个(N个)val

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/330742.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

会话技术Cookie

1.会话技术的概念 会话∶浏览器和服务器之间的多次请求和响应。为了实现一些功能&#xff0c;浏览器和服务器之间可能会产生多次的请求和响应&#xff0c;从浏览器访问服务器开始&#xff0c;到访问服务器结束(关闭浏览器、到了过期时间)。这期问产生的多次请求和响应加在一起…

终于搞懂了回车与换行的区别

转自&#xff1a; http://blog.csdn.net/fanwenbo/article/details/54848429 转载于&#xff1a;http://www.pythontab.com/html/2017/linuxkaiyuan_0115/1116.html 关于换行和回车其实平时我们不太在意&#xff0c;所以关于两者的区别也不太清楚&#xff0c;在平时开发时可能会…

分布式服务防雪崩熔断器,Hystrix理论+实战

转载自 分布式服务防雪崩熔断器&#xff0c;Hystrix理论实战Hystrix是什么&#xff1f; hystrix对应的中文名字是“豪猪”&#xff0c;豪猪周身长满了刺&#xff0c;能保护自己不受天敌的伤害&#xff0c;代表了一种防御机制&#xff0c;这与hystrix本身的功能不谋而合&#xf…

会话技术Session

1.Session的概念 Session是依赖于Cookie的&#xff0c;每次请求时&#xff0c;会将特殊标识带到服务器端&#xff0c;根据这个标识来找到对应的内存空间&#xff0c;从而实现数据共享!是Servlet规范中四大域对象之一的会话域对象。作用:是Servlet规范中四大域对象之一的会话域…

完整的支付系统整体架构

转载自 【干货】完整的支付系统整体架构&#xff01; 从产品分类、模块功能和业务流程&#xff0c;了解支付产品服务的设计。 支付产品模块是按照支付场景来为业务方提供支付服务。这个模块一般位于支付网关之后&#xff0c;支付渠道之前。 它根据支付能力将不同的支付渠道封装…

Scripting elements ( lt;%!, lt;jsp:declaration, lt;%=, lt;jsp:expression, 错误的解决方法

<% page contentType"text/html;charsetUTF-8" %> <%session.setAttribute("pageContext", "it315"); %> 输出表达式\\${pageContext}的值&#xff1a;<br/> ${pageContext} 【web.xml】错误地在 web.xml中禁用了 jsp脚本元素…

JSP页面

1.jsp概述 JSP&#xff08;全称Java Server Pages&#xff09;&#xff0c;是一种动态网页开发技术。它既可以使用HTML标签来写页面&#xff0c;也可以写Java代码。其本质就是一个Servlet 2.jsp页面的访问过程 当客户端发送请求访问服务端的index.jsp页面服务器内部会把.jsp…

html模板(base标签,meta标签,禁用浏览器缓存)+JSP自定义标签荔枝

【1】html模板 <html> <head><!-- base标签表示uri相对路径的基准路径 --><base href"http://localhost:8080/asite6/chapter6/ex6_11/visitor.html"/><title>html template</title><!-- meta 模拟响应消息头&#xff1a;Co…

5分钟带你理解一致性Hash算法

转载自 5分钟带你理解一致性Hash算法一致性Hash算法背景一致性哈希算法在1997年由麻省理工学院的Karger等人在解决分布式Cache中提出的&#xff0c;设计目标是为了解决因特网中的热点(Hot spot)问题&#xff0c;初衷和CARP十分类似。一致性哈希修正了CARP使用的简单哈希算法带来…

thinking-in-java(10)内部类

【0】开场白1&#xff09;内部类&#xff1a;将一个类的定义放在另一个类的定义内部&#xff0c;这个类就是内部类&#xff1b;2&#xff09;内部类优点&#xff1a;匿名内部类的一个优点就是可以将解决问题的代码隔离&#xff0c;聚拢在一点&#xff1b;【10.1】创建内部类【荔…

金融系统中正确的金额计算及存储方式

转载自 金融系统中正确的金额计算及存储方式经典的精度丢失问题 Java中的类型float、double用来做计算会有精度丢失问题&#xff0c;下面来看下面的示例。 public static void main(String[] args) {test1();test2(); }private static void test1() {double totalAmount 0.09;…

JSTL标签库

1.JSTL介绍 JSTL(Java Server Pages Standarded Tag Library) : JSP标准标签库。主要提供给开发人员一个标准通用的标签库。 开发人员可以利用这些标签取代JSP页面上的Java 代码&#xff0c;从而提高程- 序的可读性&#xff0c;降低程序的维护难度 组成部分如下&#xff1a; …

缓存雪崩,缓存穿透,缓存预热,缓存热备都是什么鬼?

转载自 缓存雪崩&#xff0c;缓存穿透&#xff0c;缓存预热&#xff0c;缓存热备都是什么鬼&#xff1f;缓存雪崩&#xff0c;缓存穿透&#xff0c;缓存预热&#xff0c;缓存热备是在做缓存设计或者缓存应用时经常遇到的概念&#xff0c;也是缓存应用过程中必须熟知及知道 的东…

Multi-catch parameters are not allowed for source level below 1.7 解决方法

转自&#xff1a; https://stackoverflow.com/questions/21778922/eclipse-false-error-with-jdk7 You can solve this by setting up correct JRE environment in Eclipse as below. Go to Project > Properties > Java Build Path Click on Libraries Select JRE Syste…

使用Eclipse构建Maven项目 (step-by-step)

转自&#xff1a; http://blog.csdn.net/qjyong/article/details/9098213 Maven这个个项目管理和构建自动化工具&#xff0c;越来越多的开发人员使用它来管理项目中的jar包。本文仅对Eclipse中如何安装、配置和使用Maven进行了介绍。完全step by step。 如果觉得本文对你有用&a…

字符串substring方法在jkd6,7,8中的差异

转载自 注意&#xff1a;字符串substring方法在jkd6,7,8中的差异 标题中的substring方法指的是字符串的substring(int beginIndex, int endIndex)方法&#xff0c;这个方法在jdk6,7是有差异的。 substring有什么用&#xff1f; substring返回的是字符串索引位置beginIndex开始&…

过滤器五种拦截行为

1.问题&#xff1a;如何使过滤器拦截转发的请求和响应&#xff1f; Filter 过滤器默认拦截的是客户端发送过来的请求&#xff0c;但是在实际开发中&#xff0c;我们还有请求转发&#xff0c;以及由服务器触发调用的全局错误页面。默认情况下过滤器是不参与过滤的&#xff0c;要…

redis的主从数据库复制功能

【0】开场白&#xff1a; redis提供了复制功能&#xff0c; 实现当一台数据库中的数据更新后&#xff0c; 自动将更新的数据同步到其他数据库上&#xff1b; 这样即使一条server 发生故障&#xff0c;其他服务器仍然可以继续提供服务&#xff1b;&#xff08;为数据生成多个副本…

轻松几步搞定SSH连接Git配置

转载自 轻松几步搞定SSH连接Git配置 如果使用ssh的方式管理&#xff0c;需要配置ssh key. 1、打开git bash命令窗口 2、生成ssh key ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" your_emailexample.com为github上你注册的email地址。 如下面完整创建过程…

redis哨兵

【0】redis的主从数据库实现&#xff0c; 参见&#xff1a; redis的主从数据库复制功能 1&#xff09;redis的主从数据库的作用&#xff1a; 在一主多从的redis系统中&#xff0c; 从数据库起到了 数据冗余备份和读写分离的作用&#xff1b; 2&#xff09;redis2.8提供的哨兵…