[SQL Server 2005]统计学自动分组问题
2010-03-19 21:06
274 查看
统计学自动分组问题
学过统计学或者做过 BI 的应该知道,很多报表 需要以区间统计的方式来实现,怎么分组比较合理,什么的组距比较合适,会困扰很多人;本文给出一个自动分组的方法,稍微修改一下,便可以做成通用区间分组程序。
关于统计学组距分组参考以下链接:
http://wiki.mbalib.com/wiki/%E7%BB%84%E8%B7%9D%E5%88%86%E7%BB%84
第一步: 确定组数。一组数据分多少组合适呢?一般与数据本身的特点及数据的多少有关。由于分组的目的之一是为了观察数据分布的特征,因此组数的多少应适中。如组数太少,数据 的分布就会过于集中,组数太多,数据的分布就会过于分散,这都不便于观察数据分布的特征和规律。组数的确定应以能够显示数据的分布特征和规律为目的。在实 际分组时,可以按 Sturges 提出的经验公式来确定组数 K
k= 1 + log(n) / log(2)
![](http://space.itpub.net/attachments/2010/02/6517_201002221458351.jpg)
第二步: 确定各组的组距
组距 =(Max(Value)-Min(Value))/K
第三步: 根据分组整理成频数分布表.
以下为一个例子: 源数据为的一批杂乱的年龄数据, 统计的结果为“各个年龄段的人数”.
-- 创建表和数据
CREATE TABLE AutoGroup(Age INT);
INSERT INTO AutoGroup VALUES(12);
INSERT INTO AutoGroup VALUES(10);
INSERT INTO AutoGroup VALUES(20);
INSERT INTO AutoGroup VALUES(25);
INSERT INTO AutoGroup VALUES(27);
INSERT INTO AutoGroup VALUES(30);
INSERT INTO AutoGroup VALUES(50);
INSERT INTO AutoGroup VALUES(60);
INSERT INTO AutoGroup VALUES(45);
INSERT INTO AutoGroup VALUES(46);
INSERT INTO AutoGroup VALUES(35);
INSERT INTO AutoGroup VALUES(30);
INSERT INTO AutoGroup VALUES(47);
INSERT INTO AutoGroup VALUES(20);
INSERT INTO AutoGroup VALUES(61);
--SELECT age FROM AutoGroup
-- 第一步,获取最大值、最小值、以及记录数量
WITH MaxAndMin AS
(SELECT MAX(age) MaxNum,MIN(age) MinNum,COUNT(*) CountNum FROM AutoGroup),
-- 第二步,确定组数和组距。
GroupStep AS
(SELECT MaxNum,MinNum,CountNum, CEILING (1+LOG(CountNum)/LOG(2)) GroupNum,
CEILING(CEILING(MaxNum-MinNum)/CEILING(1+LOG(CountNum)/LOG(2))) GroupStep
FROM MaxAndMin),
-- 第三步,递归生成相应的频数分布表
GroupStandard(MinGroup,MaxGroup,Identiy) AS
( SELECT e.MinNum MinGroup,e.MinNum+e.GroupStep MaxGroup,1 AS Identiy
FROM GroupStep AS e
UNION ALL
SELECT CAST(e.MinNum+e.GroupStep*identiy AS INT) MinGroup,
e.MinNum+e.GroupStep*(Identiy+1) MaxGroup, Identiy+1 c
FROM GroupStep AS e,GroupStandard d
WHERE d.Identiy<e.GroupNum
)
-- 第四步,根据频数表和原表进行相关区间统计
SELECT MinGroup MinAge, MaxGroup MaxAge, count (*) amount
FROM AutoGroup a, GroupStandard b
WHERE a.age>= b.MinGroup AND a.age < b.MaxGroup
GROUP BY MinGroup, MaxGroup
-- 返回的结果集为:
MinAge MaxAge amount
10 21 4
21 32 4
32 43 1
43 54 4
54 65 2
学过统计学或者做过 BI 的应该知道,很多报表 需要以区间统计的方式来实现,怎么分组比较合理,什么的组距比较合适,会困扰很多人;本文给出一个自动分组的方法,稍微修改一下,便可以做成通用区间分组程序。
关于统计学组距分组参考以下链接:
http://wiki.mbalib.com/wiki/%E7%BB%84%E8%B7%9D%E5%88%86%E7%BB%84
第一步: 确定组数。一组数据分多少组合适呢?一般与数据本身的特点及数据的多少有关。由于分组的目的之一是为了观察数据分布的特征,因此组数的多少应适中。如组数太少,数据 的分布就会过于集中,组数太多,数据的分布就会过于分散,这都不便于观察数据分布的特征和规律。组数的确定应以能够显示数据的分布特征和规律为目的。在实 际分组时,可以按 Sturges 提出的经验公式来确定组数 K
k= 1 + log(n) / log(2)
![](http://space.itpub.net/attachments/2010/02/6517_201002221458351.jpg)
第二步: 确定各组的组距
组距 =(Max(Value)-Min(Value))/K
第三步: 根据分组整理成频数分布表.
以下为一个例子: 源数据为的一批杂乱的年龄数据, 统计的结果为“各个年龄段的人数”.
-- 创建表和数据
CREATE TABLE AutoGroup(Age INT);
INSERT INTO AutoGroup VALUES(12);
INSERT INTO AutoGroup VALUES(10);
INSERT INTO AutoGroup VALUES(20);
INSERT INTO AutoGroup VALUES(25);
INSERT INTO AutoGroup VALUES(27);
INSERT INTO AutoGroup VALUES(30);
INSERT INTO AutoGroup VALUES(50);
INSERT INTO AutoGroup VALUES(60);
INSERT INTO AutoGroup VALUES(45);
INSERT INTO AutoGroup VALUES(46);
INSERT INTO AutoGroup VALUES(35);
INSERT INTO AutoGroup VALUES(30);
INSERT INTO AutoGroup VALUES(47);
INSERT INTO AutoGroup VALUES(20);
INSERT INTO AutoGroup VALUES(61);
--SELECT age FROM AutoGroup
-- 第一步,获取最大值、最小值、以及记录数量
WITH MaxAndMin AS
(SELECT MAX(age) MaxNum,MIN(age) MinNum,COUNT(*) CountNum FROM AutoGroup),
-- 第二步,确定组数和组距。
GroupStep AS
(SELECT MaxNum,MinNum,CountNum, CEILING (1+LOG(CountNum)/LOG(2)) GroupNum,
CEILING(CEILING(MaxNum-MinNum)/CEILING(1+LOG(CountNum)/LOG(2))) GroupStep
FROM MaxAndMin),
-- 第三步,递归生成相应的频数分布表
GroupStandard(MinGroup,MaxGroup,Identiy) AS
( SELECT e.MinNum MinGroup,e.MinNum+e.GroupStep MaxGroup,1 AS Identiy
FROM GroupStep AS e
UNION ALL
SELECT CAST(e.MinNum+e.GroupStep*identiy AS INT) MinGroup,
e.MinNum+e.GroupStep*(Identiy+1) MaxGroup, Identiy+1 c
FROM GroupStep AS e,GroupStandard d
WHERE d.Identiy<e.GroupNum
)
-- 第四步,根据频数表和原表进行相关区间统计
SELECT MinGroup MinAge, MaxGroup MaxAge, count (*) amount
FROM AutoGroup a, GroupStandard b
WHERE a.age>= b.MinGroup AND a.age < b.MaxGroup
GROUP BY MinGroup, MaxGroup
-- 返回的结果集为:
MinAge MaxAge amount
10 21 4
21 32 4
32 43 1
43 54 4
54 65 2
相关文章推荐
- 关于SQLServer2005的学习笔记——统计学自动分组问题
- 关于SQLServer2005的学习笔记——统计学自动分组问题
- 解决SQL server 2005主键自动增长问题
- SQL server 2005主键序列自动增长问题
- 关于SQLServer2005的学习笔记——统计学自动分组问题
- SQL Server 2005版本安装问题
- SQL SERVER 2005允许自定义聚合函数-表中字符串分组连接
- Sql Server 2005数据库被标记为“可疑”问题
- 在SQL Server 2005中设置自动编号字段
- 安装sql server 2005遇到的问题
- SQL Server 2005无法连接问题的解决办法
- 无法在 SQL Server 2005 Manger Studio 中录入中文的问题
- sql server 2005 自动备份
- SQL Server 2005 中处理表分区问题(分区表性能和分区切换)
- sql server 2005 连接不到服务器 "已成功与服务器建立连接,但是在登录前的握手期间发生错误"问题解决方案
- SQL2005卸载不彻底,导致的重新安装不上的问题(如SQL Server 2005提示安装了同名实例)
- sql server 2005 连接与登陆失败问题
- SQL Server 2005 安装失败 解压失败: Extraction Failed 拒绝访问: ACCESS DENIED 问题解决
- 解决SQL SERVER 2005无法远程连接的问题
- Sql Server 2005 数据库备份还原后出现“受限制用户”问题的解决