Sql示例说明如何分组后求中间值--【叶子】
这里所谓的分组后求中间值是个什么概念呢?
我举个例子来说明一下:
假设我们现在有下面这样一个表:
type name price
----------- ---- ------------
2 A 5.4
2 A 3.7
2 B 4.3
1 B 4.7
2 B 6.7
2 B 9.8
3 a 3.0
3 a 4.0
3 a 10.0
3 a 20.0
我们要得到什么样的效果呢?
按type和name进行分组后求中间值:
是不是就是这样呢:
select [type],name,AVG(price) from @table
group by type,name
/*
type name
----------- ---- ---------------------------------------
2 A 4.550000
3 a 9.250000
1 B 4.700000
2 B 6.933333
*/
不是的,我所说的中间值和平均数还不太一样,平均数就是均值,但是中间值是说分组如果有奇数个就是中间那个,如果有偶数个就是中间两个值的均值。
例如上面数据中3,a分组后有3,4,10,20四个数,那中间值就是4和10个均值。
例如上面按2,B分组后有4.3 和6.7 及9.8三个值,那中间值就是6.7
我们如何能达到这样效果呢,写个简单的例子:
declare @table table ([type] int,name varchar(1),price numeric(3,1))
insert into @table
select 2,'A',5.4 union all
select 2,'A',3.7 union all
select 2,'B',4.3 union all
select 1,'B',4.7 union all
select 2,'B',6.7 union all
select 2,'B',9.8 union all
select 3,'a',3 union all
select 3,'a',4 union all
select 3,'a',10 union all
select 3,'a',20
--sql查询如下:
;with maco as
(
select
[type],name,price,
m_asc=row_number() over(partition by type,name order by price),
m_desc=row_number() over(partition by type,name order by price desc)
from @table
)
--select * from liang
select [type],name,avg(price) as price
from maco
where m_asc in(m_desc,m_desc+1,m_desc-1)
group by type,name
order by type,name
/*
type name price
----------- ---- -----------
1 B 4.700000
2 A 4.550000
2 B 6.700000
3 a 7.000000
*/
Sql示例说明如何分组后求中间值--【叶子】的更多相关文章
- SQL实现group by 分组后组内排序
在一个月黑风高的夜晚,自己无聊学习的SQL的时候,练习,突发奇想的想实现一个功能查询,一张成绩表有如下字段,班级ID,英语成绩,数据成绩,语文成绩如下图 实现 查询出 每个班级英语成绩最高的前两名的记 ...
- sql 用Group by分组后,取每组的前几条记录
转自:http://blog.163.com/jeson_lwj/blog/static/135761083201052411115783/ --查询每门课程的前2名成绩 CREATE TABLE S ...
- SQL,group by分组后分别计算组内不同值的数量
select name as 姓名,sum( case when cargo='笔' then 1 else 0 end ) as 笔,sum( case when cargo='橡皮' then 1 ...
- SQL中获取排序分组后数据的脚本
废话不多说了,先上一段代码,如下所示: select distinct b.OrgID,b.CompanyID,b.AreaID,b.CustChannelID,b.CustID,b.SaleTo ...
- SQL获取分组后取某字段最大一条记录(求每个类别中最大的值的列表)
获取分组后取某字段最大一条记录 方法一:(效率最高) select * from test as a where typeindex = (select max(b.typeindex) from t ...
- SQL 分组后取最小行号记录
本示例测试两个表联接查询后,分组并取分组后的最小行号记录 测试表: tb1表结构如下: CREATE TABLE [dbo].[tb1]( ) NOT NULL, ) NULL, ) NULL, CO ...
- SQL Server 分组后取Top N
SQL Server 分组后取Top N(转) 近日,工作中突遇一需求:将一数据表分组,而后取出每组内按一定规则排列的前N条数据.乍想来,这本是寻常查询,无甚难处.可提笔写来,终究是困住了笔者好一会儿 ...
- sql 分组后显示每组的前几条记录
sql 分组后显示每组的前几条记录 如 表中记录是 code serialno A1 1 ...
- sql 分组后按时间降序排列再取出每组的第一条记录
原文:sql 分组后按时间降序排列再取出每组的第一条记录 竞价记录表: Aid 为竞拍车辆ID,uid为参与竞价人员ID,BidTime为参与竞拍时间 查询出表中某人参与的所有车辆的最新的一条的竞价记 ...
随机推荐
- Automatically generate serial number in abap
流水号的产生: 在ABAP开发中,很多地方都需要按照自己的规则生成流水号,把这些流水号保存进透明表,作为唯一标示. 一. 系统中设定流水号 使用T-Code SNRO来创建一个流水号标识对象. 输 ...
- 部署 Redis 群集
Windows 部署 Redis 群集 1,下载Redis for windows 的最新版本,解压到 c:\Redis 目录下备用https://github.com/MSOpenTech/re ...
- Spring 事情具体详尽的解释
一.Spring事务管理 1. Spring事务管理机制 三个核心部分 1) PlatformTransactionManager 平台的事务管理器 commit 提交事务.rollback ...
- hdu2242(树形dp+tarjan+缩点)
hdu2242 http://acm.hdu.edu.cn/showproblem.php?pid=2242 给定n,m表示n个点,m条边 每个点有个权值 问我们删除两某条边(割边)后将图分为两个部分 ...
- Nim博弈游戏
给定n堆石子,每次每人能从一堆石子中取若干个石子(不能不取),最后不能取石子者败 对于这个游戏,我们要判断的是,给定局势下,先手者胜还是败 设先手胜的局势为N-postion,先手败的局势为P-pos ...
- 使用ToggleButton和StackPanel+Border实现圆角开关按钮动画效果
<ToggleButton Height=" HorizontalAlignment="Left" Margin="138,122,0,0" N ...
- 询url包括字符串参数(js高度注意事项)
以防万一 url="http://write.blog.csdn.net/postedit? id=5&search=ok" function getArgs() { v ...
- CentOS下tmux安装与使用
tmux介绍: tmux它是BSDScreen替代品,相对于Screen,它更加先进:支持屏幕切分,并且具备丰富的命令行參数,使其能够灵活.动态的进行各种布局和操作.它能够做到一条命令就启动起来(强大 ...
- uva 11396Claw Decomposotion(二分图判定)
题目大意:给出一个简单无向图,每一个点的度为3.推断是否能将此图分解成若干爪的形式.使得每条边都仅仅出如今唯一的爪中. (点能够多次出如今爪中) 这道题实质上就是问这个图是否为二分图,dfs判定 ...
- Dubbo入门基础与实例讲解(转)
林炳文Evankaka原创作品.转载请注明出处http://blog.csdn.net/evankaka Dubbo是阿里巴巴SOA服务化治理方案的核心框架,每天为2,000+个服务提供3,000,0 ...