学院首页>网络编程>SQL Server>用SQL Server 2005数据库生成直方图

用SQL Server 2005数据库生成直方图

作者:sixth 来源:51CTO 添加时间:2006-5-26 10:01:20

解决方案 1:使用等级表

第一个解决方案涉及到编写一个生成派生表 Steps 的查询,该表包含等级号和每个等级的值的范围。生成这样一个表后,该解决方案就显得简单了。您需要完成的操作是:根据属于等级范围内的 value 列将派生表 Steps 联接到 Samples 表、根据等级号对结果进行分组、计算每组内的行数。这个解决方案中比较困难的地方就是编写生成派生表的查询。要生成等级号,可以使用一个名为 Nums 的辅助表,在该表中填充有一个范围为 1 到 的整数序列。运行 清单 2 中的脚本可创建 Nums 辅助表,并向其中填充 1000 个整数。

要计算每个等级范围的下限和上限,需要交叉连接两个查询的结果:一个是针对 Nums 的查询,以返回等级号,另一个是针对 Samples 的查询,以返回最小度量值和最大度量值。产生的查询可能如 清单3 所示。该查询对每个等级号返回相同的常规最小度量值和最大度量值。这只是该解决方案中的中间结果;稍后您会将常规最小值和最大值与等级号一起使用,以便计算等级的最小值和最大值。

现在,您需要用返回的表达式替换 SELECT 列表中的星号,此外,还需要替换等级号以及等级范围的下限(不包括)和上限(包括)。等级号很简单,是 n。

以下代码是构建计算下限的表达式的基础:

mn + *(n-1) - 1

其中,mn 是常规最小度量值,n 是等级号,step_size 是每个等级所覆盖范围的大小。用于计算 step_size 的表达式如下所示:

(mx-mn+1)/@numsteps

通过将这两个表达式结合在一起,您可以得到

mn + (mx-mn+1)/@numsteps*(n-1) - 1

如果您得到的值范围总是能用等级数来整除,那么,使用上面这个表达式就可以了,但在实际应用中,情况却并不总是如此。下面的表达式使用数值除法和舍入法,适用于不能用等级数整除的值范围:

mn + CAST(round(1.0*(mx-mn+1)/@numsteps*(n-1), 0) AS int) - 1

您可以通过将除法运算的第一个操作数与数值 1.0(读法是一点零)相乘来进行分数除法(而非整数除法),这意味着 SQL Server 不会截断小数部分。然后,您需要对结果进行舍入,以便得到整个范围的上限和下限。之后,SQL Server 将经过舍入的结果转换为整数,以便去掉小数点后没有意义的零。您可以用相似的方式来计算上限:

mn + CAST(round(1.0*

(mx-mn+1)/@numsteps*n, 0)

AS int) - 1

第 2 页,共 2 页 [1] [2]
站内搜索