Sql示例说明如何分组后求中间值--【叶子】

原文: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

*/

时间: 2024-09-19 10:01:01

Sql示例说明如何分组后求中间值--【叶子】的相关文章

SQL中获取排序分组后数据的脚本

  废话不多说了,先上一段代码,如下所示: select distinct b.OrgID,b.CompanyID,b.AreaID,b.CustChannelID,b.CustID,b.SaleTotalQty, GETDATE() from KDS400TelSurveyCustAll_Temp as tmp1 cross apply ( select top 10 percent * from KDS400TelSurveyCustAll_Temp tmp2 where tmp1.OrgI

分组后分组合计以及总计SQL语句(稍微整理了一下)

今天看到了这个文章感觉内容挺多的,就是比较乱,实在不好整理,脚本之家小编就简单整理了一下,希望大家能凑合看吧 分组后分组合计以及总计SQL语句   1)想一次性得到分组合计以及总计,sql: SELECT 分组字段 FROM 表 GROUP BY 分组字段 compute sum(COUNT(*)) 2)分组合计1: SELECT COUNT(*) FROM (SELECT 分组字段 FROM 表 GROUP BY 分组字段 )别名 3)分组合计2: SELECT COUNT(*) FROM (

oracle数据库-跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢

问题描述 跪求:oracle如何在数据分组后更新(update)?求大神指导啊~~~万分感谢 如题:org_info 表内容如下: ID NAME TEL ADDR OP_TYPE OCCUR_DATE 1001 aaa 888888 ppppppp 2014-07-23 1001 aaa 999999 ppppppp 2011-03-19 1002 bbb 666666 yyyyyyy 2014-09-15 1002 ipow 221 fghfghfh 2009-07-08 1002 ipow

sql server 2008分组后如何实现分页查询

问题描述 sql server 2008分组后如何实现分页查询 我的SQL语句是这样的 select left(loginDate,10) ,skipUrl,count(loginDate) FROM loginlog group by skipUrl,left(loginDate,10) order by left(loginDate,10) desc 我自己试了很多总方式都不对的,不知道问题出在哪里的了?希望大侠帮忙解决下的了谢谢! select top 10 left(loginDate,

sql 分组后获取其中一个字段最大值的整条记录

mysql的语句:  代码如下 复制代码 SELECT  * FROM (SELECT * FROM testTable ORDER BY createDate desc) pcc GROUP BY name Mysql中在分组前先排好序就可以找到需要的记录了,返回的就是按照name分组后不重复的符合条件的第一条记录. 在sqlserver中有很好的解决办法,  代码如下 复制代码 select * from ( select id,name,counts,createDate,row_numb

SQL进行排序、分组、统计的10个新技巧分享_MsSql

1.使用排序使数据有序通常,你的所有数据真正需要的仅仅是按某种顺序排列.SQL的ORDER BY语句可以以字母或数字顺序组织数据.因此,相似的值按组排序在一起.然而,这个分组时排序的结果,并不是真的分组.ORDER BY显示每条记录而分组可能代表很多记录.2.进行分组除去重复值 排序和分组之间的最大区别是:排序的数据显示所有记录(在限定标准范围之内),而分组数据不是显示所有记录.GROUP BY语句对于同样的值只显示一条记录.例如,下面的语句中的GROUP BY语句对数据源中重复出现的数据只返回

SQL进行排序、分组、统计的10个新技巧分享

1.使用排序使数据有序 通常,你的所有数据真正需要的仅仅是按某种顺序排列.SQL的ORDER BY语句可以以字母或数字顺序组织数据.因此,相似的值按组排序在一起.然而,这个分组时排序的结果,并不是真的分组.ORDER BY显示每条记录而分组可能代表很多记录. 2.进行分组除去重复值 排序和分组之间的最大区别是:排序的数据显示所有记录(在限定标准范围之内),而分组数据不是显示所有记录.GROUP BY语句对于同样的值只显示一条记录.例如,下面的语句中的GROUP BY语句对数据源中重复出现的数据只

js-Easyui-datagrid groupview分组后勾选问题

问题描述 Easyui-datagrid groupview分组后勾选问题 解决方案 你这个是detailview插件吧,自己看demo:http://www.jeasyui.com/demo/main/index.php?plugin=DataGrid&theme=default&dir=ltr&pitem= 这个链接里面的Master Detail $('#dg').datagrid({ view: detailview, detailFormatter:function(in

greenplum-postgreSQL里如何自定义函数实现分组后字段的拼接

问题描述 postgreSQL里如何自定义函数实现分组后字段的拼接 由于版本太低,无法使用string_agg,array_agg等系统函数, 能用postgreSQL自定义函数实现吗,求可执行代码!!! --建表-- create table test ( dept varchar(10) ,ename varchar(10) ); --插数-- insert into test values ('技术部','小刘'); insert into test values ('技术部','小黄')